def plusOne(digits):
# part 1
n = len(digits)
num = 0
for i in range(n):
num += digits[i] * pow(10, (n-1-i))
num += 1
# 目前已经得到加一后的数,下面要把它变成列表
# part 2
j = 0
new = []
while num > 0:
yushu = num % 10
new.append(yushu)
num = num // 10
new = new[::-1]
return new
part 2 可以用一句话实现,见下方# *****
后
def plusOne(digits):
n = len(digits)
num = 0
for i in digits:
num = num * 10 + i
# for i in range(n):
# num += digits[i] * pow(10, (n-1-i))
num += 1
# ******
num = str(num)
return [int(j) for j in num]
- 一次遍历 剪枝算法
两种情况:
一、尾数不是9,那么只有尾数会+1
二、尾数是九,那么不止尾数会+1
如129 -> 130,2 和 9 都要+1
999 -> 1000, 999 三个 9 都要+1
剪枝算法是裁剪搜索树中没有意义的,不需要搜索的树枝,以提高运算速度。
这里剪枝则是裁剪掉原列表中不需要加1的数。
如:
327 -> 328,只有7要 +1,3和 2 就可以被裁剪掉
129 -> 130,2 和 9 都要+1,首位 1 就可以被裁剪掉
999 -> 1000, 999 三个 9 都要+1,就没有裁剪的地方
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
ad = 1
for i in range(n-1, -1, -1):
# 剪枝
if ad == 0:
break
# add_num 为加一后的数字,可为1-10
add_num = digits[i] + ad
# digits该位置的原数被替换成新的
digits[i] = add_num % 10
# 如果该数有进位, ad变为1, 如果不进位, ad为0
ad = add_num // 10
# 进位(如 99 变 100)
if i == 0 and add_num == 10:
digits = [1] + digits
break
return digits