加一
leetcode 66:加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
示例:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
方法一:数学进位
若在循环中返回最终结果,说明只改动已有数组即可。否则,最前面需要添加进位 1。
由于只是加 1,每位的最大值的结果也不超过 10。若等于 10,此时当前位只需改为 0,前面一位继续加一,循环下去。
def plusOne(digits: List[int]) -> List[int]:
i = len(digits) - 1
while i >= 0:
digits[i] += 1
if digits[i] < 10:
return digits
else: # 需要进位
digits[i] = 0
i -= 1
digits.insert(0, 1) # 应对出现[9, 9, 9]这样全为9的情况。
return digits
改为速度更快的 for
循环:
def plusOne(digits: List[int]) -> List[int]:
for i in range(len(digits) - 1, -1, -1):
digits[i] += 1
if digits[i] < 10:
return digits
else:
digits[i] = 0
return [1] + digits
方法二:list
/ int
/ str
相互转换(不推荐)
简洁的做法有以下三种:
- 使用
map()
函数进行映射:
def plusOne(digits):
# digits = map(str, digits) # digits是一个迭代器
# nums = int(''.join(digits)) + 1 # 转换为整数,并加上1
# return list(map(int, str(nums))) # 数变为单个数字的列表
return list(map(int, str(int(''.join(map(str, digits))) + 1)))
- 使用
reduce()
函数进行累计:
from functools import reduce
def plusOne(digits):
s = reduce((lambda x, y: x * 10 + y), digits) + 1
return list(map(int, str(s)))
- 使用列表生成式:
def plusOne(digits):
num = int(''.join(str(n) for n in digits)) + 1
return [int(n) for n in str(num)]