加一的解决之路= =
题目描述
测试案例(部分)
第一次
+1
这个很好理解,唯一的难点就是个位+1
导致的进位的问题,可能会只会导致十位+1
,也有像8999
这样产生多次进位的情况。
为了解决进位问题,自己想到了第三天学到的逆序方法,然后从后往前判断是否有进位情况产生,满足>=10
的进位条件,就-10
,并将前一位进行+1
操作。
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
digits[-1] += 1
n = len(digits)
for i in range(n-1, 0, -1):
if digits[i] >= 10:
digits[i] -= 10
digits[i-1] += 1
return digits
测试,通过了。直接提交,报错。
第二次
有点东西的,自己考虑漏了一种情况,就是最高位是9的情况,此时要产生一个新的数位,我们来想一下该怎么完善,来应对这种情况。
注意一下这个range(n-1, 0, -1)
,输出的结果应该是n-1,n-2, ..., 2, 1
,是没有0的,所以才保证了for循环中,digits[i-1] += 1
不会越界。但也正是因为没有0,所以会导致循环中不会检测最高位是否满足进位条件。
所以,接下来就简单了,这个情况需要我们在循环之后进行处理。开始完善代码。
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
digits[-1] += 1
n = len(digits)
for i in range(n-1, 0, -1):
if digits[i] >= 10:
digits[i] -= 10
digits[i-1] += 1
if digits[0] >= 10:
digits[0] -= 10
digits = [1] + digits
return digits
循环结束后,再进行一个判断,如果最高位满足进位要求,利用python中列表可加性,直接加一个1上去(就等于Concat合并操作),这样就得到了所需的结果。
测试正确,提交,通过了。而且费时超过了77%的人,可以了。
结束。