LC-66:加一
我的实现代码:(有问题)
public class Demone { public static void main(String[] args) { int[] array = new int[]{1,2,3}; int[] ints = plusOne(array); for (int anInt : ints) { System.out.print(anInt + "\t"); } } public static int[] plusOne(int[] digits) { // 1、先将这个数字转换为字符串,并进行反转 StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < digits.length; i++) { stringBuilder.append(digits[i]); } String string = stringBuilder.reverse().toString(); // 2、对反转后的字符串进行加一操作 StringBuilder newSb = new StringBuilder(); int flag = 0; // 需要对字符串中第一个元素做加一操作 int firstNumber = string.charAt(0) - 48; if (firstNumber + 1 > 9) { // 如果大于9的话,就做进位操作 newSb.append((firstNumber + 1) % 10); //加完后的数字取模添加 flag = (firstNumber + 1) / 10; // 进位的标志 } else { //反之的话,就只是添加一个元素 newSb.append((firstNumber + 1) % 10); //加完后的数字取模添加 } for (int i = 1; i < string.length(); i++) { // 从第二个元素开始判断 if (((string.charAt(i) - 48) + flag) > 9) { newSb.append(((string.charAt(i) - 48) + flag) % 10); //加完后的数字取模添加 flag = ((string.charAt(i) - 48) + flag) / 10; // 进位的标志 } else { //反之的话,就只是添加一个元素 newSb.append(((string.charAt(i) - 48) + flag) % 10); //加完后的数字取模添加 } } // 3、最后对进位判断如果为1,就添加到数组中 if (flag == 1) { newSb.append(1); } // 4、对反转的字符串进行再次反转,进行还原 String s = newSb.reverse().toString(); // 5、初始化一个数组 int[] array = new int[s.length()]; for (int i = 0; i < s.length(); i++) { array[i] = s.charAt(i) - 48; } return array; } }
正确代码思路:
public int[] plusOne(int[] digits) { int n = digits.length; for (int i = n - 1; i >= 0; --i) { if (digits[i] != 9) { ++digits[i]; for (int j = i + 1; j < n; ++j) { digits[j] = 0; } return digits; } } // digits 中所有的元素均为 9 int[] ans = new int[n + 1]; ans[0] = 1; return ans; }
第一种,最后一个数不是9 的话,就直接加一就行了,然后返回;
第二种,如果最后一个数是9的话,就往前面走,直到一个不是9为止,然后对其加一,然后需要对它后面的全是9 的元素进行操作,全部赋值为0;
第三种,如果数组里面的所有的元素都是9的话,那么还不如直接创建一个新的数组,数组的长度多一,多出来的是用于保存最后一个的进位;
总结,这个算法的思想很好,比自己的算法好太多了,简洁,不繁琐。
总结,这个算法的思想很好,比自己的算法好太多了,简洁,不繁琐。