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的话,那么还不如直接创建一个新的数组,数组的长度多一,多出来的是用于保存最后一个的进位;
总结,这个算法的思想很好,比自己的算法好太多了,简洁,不繁琐。
全部评论

相关推荐

11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务