#javascript #arrays #iteration #increment
#javascript #массивы #итерация #увеличьте
Вопрос:
Было интересно, может ли кто-нибудь объяснить кодовое решение этой проблемы. Для меня это не имеет смысла:
Учитывая непустой массив цифр, представляющих неотрицательное целое число, увеличьте единицу до целого числа.
Цифры хранятся таким образом, что самая значащая цифра находится в начале списка, и каждый элемент в массиве содержит одну цифру.
Вы можете предположить, что целое число не содержит никакого начального нуля, кроме самого числа 0.
Решение заключается в следующем :
var plusOne = function(digits) {
let carry = true
for (let i = digits.length - 1; i >= 0; i -= 1) {
if (digits[i] === 9 amp;amp; carry) {
digits[i] = 0;
if (i === 0) {
digits.unshift(1);
break;
}
} else if (carry) {
digits[i] = 1;
carry = false;
}
}
return digits;
};
У меня есть несколько вопросов об этом решении :
- какова цель переноса переменной?
- почему для digits[i] установлено значение 0?
- почему существует оператор if, проверяющий (i===0)? И, в свою очередь, почему после этого добавляется 1?
Любые рекомендации будут оценены, спасибо!!
Комментарии:
1. Он реализует базовый способ добавления двух десятичных чисел с помощью карандаша и бумаги. Помните, как, когда две цифры в соответствующей части двух чисел составляют более 9? Что вы делаете? Вы переносите 10 в следующий столбец цифр.
2. Возможно, составьте три или четыре пары случайных 4-значных чисел и сложите их вместе (на бумаге), думая о том, что вы делаете.
3. Ну, это еще проще, составьте несколько случайных 4-значных чисел и добавьте к ним 1.
4. @Pointy Я понимаю, что ты говоришь. Однако я не совсем понимаю часть unshift (1). Скажем, с числом 439-9 становится 0, и мы добавляем 1 к 3, становясь 440. Unshift вставляет число 1, а не добавляет к цифре. Возможно, я что-то не так понимаю, поэтому, пожалуйста, позвоните мне!
5.
.unshift(1)
просто вставьте дополнительный 1 в начало результирующего массива. Когда вы просто добавляете единицу, перенос не может быть никаким значением, отличным от 1, потому что единственный способ «перетечь» из одного столбца в следующий — это добавить от 1 до 9.
Ответ №1:
У вас есть массив целых чисел, где каждый элемент в массиве представляет собой цифру числа. Допустим, вам дано 456, тогда при индексе 0 у вас есть 4, при индексе 1 у вас есть 5, а при индексе 2 у вас есть 6.
Теперь проблема просит вас добавить 1 к заданному числу.
Здесь перенос — это математический перенос, который используется, когда вам нужно добавить две цифры, сумма которых больше 10. По умолчанию мы переносим как true, потому что вы все равно добавляете 1 к числу. Сначала вы выполняете итерацию (в обратном порядке) по заданным цифрам и ищете цифры, равные 9 (перенос равен true), затем измените текущую цифру на ноль и поместите 1 впереди. Если перенос имеет значение true и цифра не равна 9, тогда просто добавьте 1 к цифре.
примеры :
plusOne([4,9,7])
(3) [4, 9, 8]
здесь задано число 497, и вы просто добавляете 1 к последней цифре.
plusOne([1,4,9])
(3) [1, 5, 0]
здесь мы видим, что последняя цифра равна 9, поэтому сначала мы меняем ее на ноль, а затем добавляем 1 к предпоследней цифре.
plusOne([9,9,9])
(4) [1, 0, 0, 0]
здесь мы видим, что все цифры равны 9, мы меняем все цифры на ноль и добавляем 1 в начале (здесь используется смещение 1).
Комментарии:
1. В этом ограниченном случае сумма двух цифр никогда не будет больше 10, потому что все цифры, отличные от последней в значении
1
, равны нулю. Так что все , о чем ему нужно беспокоиться , — это цифра9
.2.
var plusOne = function(arr) { for (let i = arr.length - 1; i >= 0; i--) { if (arr[i] === 9){ arr[i] = 0; if (i===0){ arr.unshift(1); } } else if (arr[i] != 9) { arr[i] } return arr } }
Это решение, которое я придумал. Можете ли вы объяснить, почему это не сработает, или как я мог бы изменить его, чтобы оно было правильным?3. @NineTails спасибо за примеры, теперь смещение имеет больше смысла