66. 加一
1.题目
- 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
法一、for+if
-
思路:定位到数组的最后一位,如果是0-8就直接最后一位+1,如果是9,就让最后一位为0
-
错误原因:未考虑到全部为9的特殊情况以及数组只有一个元素的情况(数组长度需要+1)
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
for i in range (n):
if i != n-1:
i += 1
else:
if digits[i] >= 0 and digits[i] <= 8:
digits[i] = digits[i] + 1
else :
digits[i] = 0
digits[i-1] = digits[i-1]+1
return digits
- 正确解法:
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
# 从列表的最后一位开始遍历
for i in range(n-1, -1, -1):#从n-1开始,每次递减1,递减到最后一位(也就是0)
# 如果当前数字小于 9,则直接加一并返回结果
if digits[i] < 9:
digits[i] += 1
return digits
# 如果当前数字等于 9,则将其设为 0,继续循环处理前一位数字
digits[i] = 0
# 如果遍历完整个列表后仍然没有返回结果,则说明需要进位,需要在列表的最前面插入一个 1
digits.insert(0, 1)
return digits
法二、利用字符串特性
- 思路:将列表 digits 中的每个元素转换为字符串,并将它们按顺序拼接起来形成一个字符串。然后,将这个字符串转换为整数,加一,再将结果转换为字符串。最后,遍历这个字符串的每个字符,并将每个字符转换为整数,添加到列表 l 中。最终,返回列表 l 作为加一后的结果。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
s = ''
l = []
for i in digits:
s = s + str(i) # 将列表中的每个元素转换为字符串,并拼接起来
for n in str(int(s) + 1): # 将拼接后的字符串转换为整数,加一,然后再将结果转换为字符串
l.append(int(n)) #然后遍历该字符串的每个字符,并将每个字符转换为整数,添加到列表 l 中
return l