一. 题目
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
二.思考及实现代码
简单来说就是一个array里每项的元素按十进制位(..., 百,十,个)摆放,组成一个整数;然后将这个整数加一,再按位摆放放回这个array。
1)自己的思路
1> 双循环:按位提出,然后加一,然后再按位放回。
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
# method 1
ori_sum = 0
n = len(digits) - 1
for i in digits:
ori_sum += i * 10**n
n -= 1
final_sum = ori_sum + 1
new_list = []
while final_sum != 0:
new_list.append(final_sum % 10)
final_sum = final_sum//10
new_list.reverse()
return new_list
Notice:拆解n位整数按位变成list的方法,1. 循环除10取余放到list里再除以10,直到为0;2.转成str,再按位循环变为int放到list里 (这个在用时较少的范例里使用过)
2> for和if的融合:从给定的array的末项起循环判断是否为9:
如果不为9直接加一,return array;
如果为9再判断index是否为第0位:
如果不为第0位,将其值置零,index -1,接着循环
如果为第0位,置0,再在第0位插入1,return array。
# method 2
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
i = len(digits) - 1
while i >= 0:
if digits[i] != 9:
digits[i] = digits[i] + 1
return digits
else:
if i == 0:
digits[i] = 0
digits.insert(0, 1)
return digits
else:
digits[i] = 0
i -= 1
2)用时最短范例
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
if digits == [] or digits == None:
return []
m = 1
n = len(digits) - 1
while n >= 0:
k = digits[n] + m
m = k // 10
digits[n] = k % 10
if m == 0 and n > 0:
return digits
n -= 1
if m != 0:
digits = [1] + digits
return digits
这个范例和我自己的第二种思路很接近,值得学习的点是:
1. 利用除以10取模的方式判断是否需要进位,当前位的数字为多少。两个参数,一个m,一个k:m为进位标志,m如果为1,则进位接着循环判断;k为指定数值的变量,k%10就是当前位的值。
2. list可以用‘+’来拼接, 代替 list.insert(0,1) (但时间复杂度应该差不多,只是不同的两种方法而已)