目录
题目描述
本题来源于力扣66.加一
给定一个表示 大整数 的整数数组 digits,其中 digits[i] 是整数的第 i 位数字。这些数字按从左到右,从最高位到最低位排列。这个大整数不包含任何前导 0。
将大整数加 1,并返回结果的数字数组。
示例1:
输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
加 1 后得到 123 + 1 = 124。
因此,结果应该是 [1,2,4]。
示例2:
输入: digits = [9]
输出: [1,0]
解释: 输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。
思路分析
本题目可以分两种情况来分析
(1)加1后没有产生进位
(2)加1后产生进位
对于(1)就非常简单了,把数组最后一位+1返回就行,下面主要来说(2)
(2)的主要问题是连续进位,即最后一位进位之后,前面如果是9则需要继续进位,下面介绍两种解决方法
一般法
笔者自己做的时候用的是这种方法,主要思路为:
设置一个标识变量carry_flag来表示当前是否有未处理的进位,然后倒着遍历数组
(1)如果当前遍历的元素是9并且carry_flag=1,说明要进位,当前元素改成0,carry_flag不变
(2)如果当前遍历的元素不是9并且carry_flag=1,说明无需进位,把当前元素加1后返回整个数组即可
(3)如果一直没有进到(2),说明数组是全由9构成(如[9,9,9]),这种情况下返回时在最前面需要添加一个1,即999变成1000
代码见第三节
秀儿法
本来笔者觉得自己的思路还算简洁,但看了题解竟然还有更变态的,这里引用力扣用户灵茶山艾府的题解,出处:66. 加一 - 力扣(LeetCode)
算法:
从右往左找第一个不等于 9 的数,记作 digits[i]。
进位,把 digits[i] 加一,把下标在 [i+1,n−1] 中的数全变成 0。
特别地,如果所有数都等于 9,那么答案为 [1,0,0,...,0],其中有 n 个 0。
代码
一般法
python
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
flag = 1 if digits[len(digits) - 1] == 9 else 0
if flag == 0:
digits[len(digits) - 1] += 1
return digits
else:
digits[len(digits) - 1] = 0
carry_flag = 1
for i in range(len(digits) - 2, -1, -1):
if digits[i] == 9 and carry_flag == 1:
digits[i] = 0
elif digits[i] != 9 and carry_flag == 1:
digits[i] += 1
return digits
return [1]+digits
秀儿法
python
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
for i in range(len(digits) - 1, -1, -1):
if digits[i] < 9:
digits[i] += 1 # 进位
return digits
digits[i] = 0 # 进位数字的右边数字都变成 0
# digits 全是 9,加一后变成 100...00
return [1] + digits