算法小知识------10.21----加一

113 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

加一

这是力扣的66题——加一(简单题),自己写出来的题解,这次没有消化官方题解

审题

  • 原题:

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

  • 该题题目其实有迷惑性,末位加一,但是要注意元素中只能存储单个数字,也就是0-9;(这也就是在测试用例98中才反应过来)

  • 既然知道了这个前提,就有两个分支思路

    • 0-8的末位,只需要直接末位+1就可以返回了
    • 末位 = 9的情况下,不断往上位加1,如果最后还存在加一,就证明需要开辟新的数组装更大的位数

编码

  • 中间的判断末位 = 9其实可以更优雅,但是不想每次都去遍历整个数组,就放在外面了
  • 整体的时间复杂度O(n),空间复杂度O(1),返回值不计入空间复杂度
    public static int[] plusOne(int[] digits) {
        if (digits == null){
            return null;
        }
        int len = digits.length-1;
        if (digits[len] == 9){
            int index = 1;
            for (int i = len;i>=0;i--){
                digits[i] = digits[i]+index;
                if (digits[i] >9){
                    digits[i] = 0;
                    index =1;
                }else {
                    index = 0;
                }
            }
            if (index>0){
                int[] nums = new int[digits.length+1];
                nums[0] = 1;
                for (int i = 1; i < nums.length; i++) {
                    nums[i] = digits[i-1];
                }
                return nums;
            }
            return digits;
        }else {
            digits[len] += 1;
            return digits;
        }
    }

1634800165(1).jpg