Учитывая непустой массив цифр, представляющих неотрицательное целое число, увеличьте единицу до целого числа (javascript)

#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;
};
  

У меня есть несколько вопросов об этом решении :

  1. какова цель переноса переменной?
  2. почему для digits[i] установлено значение 0?
  3. почему существует оператор 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 спасибо за примеры, теперь смещение имеет больше смысла