题目: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
解答: step1 一开始用了int接收origin,后来用了long,但还是会有溢出的问题,所以这种做法是不对的
1 class Solution { 2 public int[] plusOne(int[] digits) { 3 long origin = 0L; 4 for (int i = 0; i < digits.length; i++) { 5 origin = (origin * 10) + digits[i]; 6 } 7 String res = (origin + 1) + ""; 8 int arr[] = new int[res.length()]; 9 for (int i = 0; i < res.length(); i++) { 10 arr[i] = Integer.parseInt(res.charAt(i) + ""); 11 } 12 return arr; 13 } 14 }
然后换成了下面的写法,其中错了两次,忘记会有进位了:
1 class Solution { 2 public int[] plusOne(int[] digits) { 3 int plus = 1; 4 for (int i = digits.length - 1; i >= 0;i--) { 5 if (digits[i] <= 8) { 6 if (plus == 1) { 7 digits[i] = digits[i] + plus; 8 break; 9 } else { 10 break; 11 } 12 } else { 13 digits[i] = 0; 14 plus = 1; 15 // 错误1:[9],需要进位的,数组长度要加一 16 if (i == 0) { 17 int[] res = new int[digits.length + 1]; 18 res[0] = 1; 19 for (int j = 1;j < res.length; j++) { 20 res[j] = digits[j-1]; 21 } 22 // 错误2:忘记返回了 23 return res; 24 } 25 } 26 } 27 return digits; 28 } 29 }
然后看看别人的写法以及别人的评价,我突然觉得数组长度加一,for循环塞值是多余的了 : )
下面这位精选:
根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种: 除 99 之外的数字加一; 数字 99。 加一得十进一位个位数为 00 加法运算如不出现进位就运算结束了且进位只会是一。 所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 11 个位数置为 00,如此循环直到判断没有再进位就退出循环返回结果。 然后还有一些特殊情况就是当出现 9999、999999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。 Java class Solution { 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; } }