问题描述
懒得写
思路
计划将digits中左右数值提取出来,乘10的某次方,于是将其表达为一个完整的数值,并加一。
再将其转化为字符串类型,再将每个位值的数值转化为整数型,添加进一个列表里。
最后返回这个列表。
class Solution: def plusOne(self, digits: List[int]) -> List[int]:
reversed_digits = digits[::-1]
val = 0
for i in range(len(digits)):
val += reversed_digits[i]*(10**i)
val += 1
val_str = str(val)
digits_2 = []
for j in range(len(val_str)):
digits_2.append(int(val_str[j]))
return digits_2
可惜效果太烂,击败10%。
问问chatgpt
def plusOne(digits):
# 从数组最后一位开始遍历
for i in range(len(digits)-1, -1, -1):
digits[i] += 1
digits[i] %= 10
# 如果当前位加1后不等于10,则加1操作结束,直接返回数组
if digits[i] != 0:
return digits
# 如果遍历完整个数组还没有返回,则说明原数字为全9数,需要在数组最前面添加一位1
digits.insert(0, 1)
return digits
原来如此,从digits
最后一位数开始,依次加一并检查,如果这个数加1后不能被10整除,就代表这位数原本不是9,直接加一就好了。
如果最后一位数加一等于10,也就是能被10整除,则经过digits[i] %= 10
后这里变成0,继续循环,往前一位加1,总有数不是9的嘛。
如果恰好所有数都是9,那么最后digits
所有数都变成了0,但还没有return
,直接用insert
方法在最前面添加上1,代表10000。
最后return digits
十分甚至九分的妙啊,只是还是击败10%。。。。。。不如抄其他人的答案。
我看到一个相似的答案,不过他把最后两行改成了:
return [1] + [0] * n
这段代码创建了一个列表,其中包含一个 1 和 n 个 0。具体来说,[1]
表示一个只包含一个元素 1 的列表,而 [0] * n
表示一个长度为 n 的列表,每个元素都是 0。
然后,这两个列表使用加号 +
进行拼接,得到的结果就是一个包含一个 1 和 n 个 0 的列表。因此,整个表达式 return [1] + [0] * n
的作用是返回一个长度为 n+1 的列表,第一个元素是 1,其余元素都是 0。
经过运行,发现很慢主要是len(digits)
的问题,在一开始就先计算n = len(digits)
就会变快很多了,醉了。