Уровень - Легкий

Нам задают этот вопрос.

You are given a list of integers nums, representing a decimal number and nums[i] is between [0, 9].
For example, [1, 3, 9] represents the number 139.
Return the same list in the same representation except modified so that 1 is added to the number.
Constraints
n ≤ 100,000 where n is the length of nums.

Нам дано число = [1,3,9], и мы хотим, чтобы ответ был [1,4,0].

Этот вопрос кажется прямым. Мой первоначальный подход состоит в том, чтобы преобразовать его в строку «139», затем преобразовать в число 139 и добавить 1. Результат 140. Теперь мне просто нужно преобразовать его обратно в массив [«1», «4», «0»] . Теперь мне нужно перебрать каждый индекс, чтобы преобразовать его обратно в число. В результате окончательный ответ [1,4,0].

Однако в этом подходе есть изъян. Это работает только для безопасных целых чисел. По мере приближения к сверхбольшому значению преобразование строки в число. Результат будет отличаться от того, что мы ожидали. Согласно документации MDN.

Причина этого числа заключается в том, что JavaScript использует числа с плавающей запятой двойной точности, как указано в IEEE 754, и может безопасно представлять только целые числа от -(2^53 - 1) до 2^53 - 1.

Теперь нам нужно использовать другой подход.

Когда мы делаем арифметику, мы начинаем справа и движемся влево. Когда они равны 9, оно становится равным 0. Затем мы переносим 1 влево. Ту же идею можно применить и к этому массиву.

Вернемся к нашему примеру nums = [1,3,9].

Мы можем использовать цикл for, идущий от последнего индекса к первому.

for(let i = nums.length; i >= 0; i --{
}

Нам нужно проверить, есть ли nums [i] ‹9, если да, мы можем просто добавить 1 и вернуть результат. В противном случае, если nums [i] === 9, нам нужно сделать nums [i] = 0 и переместиться влево или на предыдущую позицию индекса.

for(let i = nums.length; i >= 0; i --{
     if(nums[i] < 9){
         nums[i] += 1
         return nums
      }else{
          nums[i] = 0
      }
} 

индекс [0,1,2]

nums[1,3,9]

Первая итерация nums [2] === 9. Оператор if неверен. Поскольку 9 не меньше 9, мы переходим к оператору else, переназначаем nums [2] = 0. Теперь наш текущий массив [1,3,0].

Теперь мы во второй итерации nums [1] === 3. Утверждение if истинно. Поскольку 4 меньше 9, мы переназначаем и добавляем 1. nums [1] = nums [1] + 1 same as nums[i] += 1. Наш текущий массив теперь [1,4,0]. Мы возвращаем этот массив и выходим из цикла.

Если у нас есть [9,9], наш результат вернет [0,0]. Чтобы решить эту проблему, нам нужно добавить 1 в начало этого нового массива.

function addOne(){
   for(let i = nums.length; i >= 0; i --{
     if(nums[i] < 9){
         nums[i] += 1
         return nums
      }else{
          nums[i] = 0
      }
    }
    nums.unshift(1)
    return nums
}