Ежедневная проблема с кодированием – это веб-сайт, который каждый день будет отправлять вам вызов по программированию на ваш почтовый ящик. Я хочу показать новичкам, как решить некоторые из этих проблем с помощью 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”