经过一早上的两个多小时才完成,,,
代码如下:
1 class Solution: 2 def plusOne(self, digits): 3 index=[] 4 for i in range(len(digits)): 5 if digits[i]==9: 6 index.append(i) 7 8 if len(index)==len(digits): 9 digits[:]=(0,)*(len(digits)+1) 10 digits[0]=1 11 else: 12 a=[i for i in range(len(digits))] 13 ret=[] 14 for i in a: #差集 15 if i not in index: 16 ret.append(i) 17 18 b=ret[-1] 19 digits[b]+=1 20 digits[b+1:]=(0,)*(len(digits)-b-1) 21 return digits 22 23 24 a=Solution() 25 digits=[1,2,3] 26 print(a.plusOne(digits))
具体思路就是:
现将digits中9的索引找出来保存在列表index中;
a是digits所有元素索引构成的列表;
求index和a的差集ret;
求ret中最大的数,就是digits中从右到左第一个不是9的项数的索引,将它自身加一,它后面的项都设置为0;
如果index的长度和digits的长度相等,说明digits中的数字都是9,将第一个数设置为1,末尾添加一个0,,,,,,
就这样。
digits[:]=(0,)*(len(digits)+1)
将digits设置为长度是len(digits)+1的全0列表。
我不知道为什么非得这样乘,不然它就只显示一个0,,这个写法是试出来的。
第一次用到了(0,)这样的用法,还是挺开心的。
之前还实现了一次,但是显示超出时间了,就算了,不在这里放了。
@@@@@@@@@@@ ——2019.9.18
完成
public int[] plusOne(int[] digits) { int len = digits.length; if(len == 0){ return new int[]{1}; } if(digits[len - 1] < 9){ digits[len - 1] ++; return digits; } //设置进位 int c = 0; //设置数组存储结果 ArrayList<Integer> list = new ArrayList<>(); //从后往前遍历 int i = len -2; list.add(0); c = 1; while(i>=0){ //满10进1,否则,将其他数字全部挪一遍 list.add(0,(c+digits[i])%10); c = (c+digits[i])/10; i++; } if(c == 1) { list.add(0, 1); } return list.stream().mapToInt(Integer::valueOf).toArray(); }
但是效率好差。
看看别人简洁明了的答案:
public int[] plusOne(int[] digits) { for (int i = digits.length - 1; i >= 0; i--) { digits[i]++; digits[i] = digits[i] % 10; if (digits[i] != 0) return digits; } digits = new int[digits.length + 1]; digits[0] = 1; return digits; }
——2020.7.10