Уровень - Легкий
Нам задают этот вопрос.
You are given a list of integersnums
, representing a decimal number andnums[i]
is between[0, 9]
. For example,[1, 3, 9]
represents the number139
. Return the same list in the same representation except modified so that1
is added to the number. Constraintsn ≤ 100,000
wheren
is the length ofnums
.
Нам дано число = [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 }