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