Рубрики
Без рубрики

Ежедневная проблема кодирования Java #002

Ежедневная проблема с кодированием – это веб-сайт, который отправит вам задачу программирования т… С тегами java, вызов, новички, ежедневная проблема с кодированием.

Ежедневная проблема с кодированием – это веб-сайт, который каждый день будет отправлять вам вызов по программированию на ваш почтовый ящик. Я хочу показать новичкам, как решить некоторые из этих проблем с помощью Java, так что это будет продолжающаяся серия моих решений. Не стесняйтесь разделять их в комментариях!

Проблема

Учитывая массив целых чисел, верните новый массив таким образом, чтобы каждый элемент в индексе i нового массива является произведением всех чисел в исходном массиве, кроме одного в i .

Например, если бы наш ввод был [1, 2, 3, 4, 5] , ожидаемый результат будет [120, 60, 40, 30, 24] . Если бы наш вклад был [3, 2, 1] , ожидаемый результат будет [2, 3, 6] .

Следовать за: что, если вы не можете использовать разделение?

Стратегия

Спойлеры! Не смотрите ниже, если не хотите увидеть мое решение!

В худшем случае каждый элемент возвращаемого массива длины N будет произведением N-1 других чисел, так что это будет O(N 2 ) решение.

Если вместо этого мы сначала умножим все элементы заданного массива вместе ( O(N) ), затем для каждого элемента возвращаемого массива разделим произведение на элемент с этим индексом в заданном массиве, вместо этого у нас будет O(N) +(N) решение.

Код

Самый простой способ сделать это – сначала умножить все элементы массива вместе, а затем разделить на элемент по индексу я чтобы получить элемент по индексу i возвращаемого массива:

  public static int[] codingProblem002 (int[] given) {

    int product = 1;

    for (int element : given) 
      product *= element;

    final int len = given.length;
    int[] retval = new int[len];

    for (int i = 0; i < len; ++i)
      retval[i] = product / given[i];

    return retval;
  }

Это решение требует N умножения, N деления и по крайней мере трех обходов примитивных массивов длины N . Мы можем немного изменить решение и инициализировать возвращаемый массив в заданный массив по мере вычисления продукта :

  public static int[] codingProblem002 (int[] given) {

    int product = 1;
    final int len = given.length;
    int[] retval = new int[len];

    for (int element : given) {
      product *= element;
      retval[i] = element;
    }

    for (int i = 0; i < len; ++i) 
      retval[i] = product / retval[i];

    return retval;
  }

Но для этого все равно требуется пройти массив заданный в первом цикле для , а также массив ректальный , а затем снова пройти массив retval во втором цикле для . Я обнаружил, что мне действительно нужны указатели на Java прямо сейчас.

Чтобы решить эту проблему без использования деления, мы можем выполнить итерацию по заданному массиву N раз, умножая каждый элемент в возвращаемом массиве (кроме i -й один) по i -й элемент заданного массива:

  public static int[] codingProblem002 (int[] given) {

    final int len = given.length;
    int[] retval = new int[len];

    // initialise all elements of `retval` to 1
    Arrays.fill(retval, 1);

    for (int i = 0; i < len; ++i) {
      for (int j = 0; j < len; ++j) {
        if (j == i) continue;
        retval[j] *= given[i];
      }
    }

    return retval;
  }

Это O(N 2 ) решение.

Я не очень доволен своими решениями здесь и был бы рад, если бы кто-нибудь мог показать более эффективный способ выполнения этой задачи по кодированию!

Весь код для решения моих ежедневных проблем с кодированием доступен по адресу github.com/awwsmm/daily .

Предложения? Дайте мне знать в комментариях.

Оригинал: “https://dev.to/awwsmm/java-daily-coding-problem-002-56j0”