66.加一

230 阅读1分钟

1.题目

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

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

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

示例 1:

输入: digits = [1,2,3]

输出: [1,2,4]

解释: 输入数组表示数字 123。

示例 2:

输入: digits = [4,3,2,1]

输出: [4,3,2,2]

解释: 输入数组表示数字 4321。

示例 3:

输入: digits = [0]

输出: [1]

  提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

2.答题

思路1(暴力解)

取出数组最后一个元素+1,如果小于10,直接赋值并返回数组。

倒序循环数组

如果当前值+1后>=10,向前一位的数组加1,否则直接返回当前数组

如果数组头的值为1,表示需要扩容,否则直接返回当前数组

public int[] plusOne(int[] digits) {
    int value = digits[digits.length - 1] + 1;
    if (value < 10) {
        digits[digits.length - 1] = value;
        return digits;
    }

    for (int i = digits.length - 1; i >= 0; i--) {
        int tmp = digits[i] + 1;
        digits[i] = tmp % 10;
        if (tmp < 10) {
            return digits;
        }
    }

    if (digits[0] != 0) {
        return digits;
    }

    int[] newDigits = new int[digits.length + 1];
    newDigits[0] = 1;
    for (int i = 0; i < digits.length; i++) {
        newDigits[i + 1] = digits[i];
    }
    return newDigits;
}

时间复杂度

使用到了1层循环,故为O(n)

空间复杂度

常量O(1),最差情况声明了新的数组为O(n)

提交结果

增加了多个边界条件判断,和提前返回等操作,代码并不好看,尝试优化一下。

1.第一次判断和循环中的判断重复了,可以直接删除

2.如果要做到数组扩容的情况,需要数组中全是9的情况才能触发,比如[9,9,9,9] ,[9,9,9] ,这种情况下加1后,扩容1位,数组头为1,其他为0

这样修改后的代码为:

public int[] plusOne(int[] digits) {
    for (int i = digits.length - 1; i >= 0; i--) {
        int tmp = digits[i] + 1;
        digits[i] = tmp % 10;
        if (tmp < 10) {
            return digits;
        }
    }

    int[] newDigits = new int[digits.length + 1];
    newDigits[0] = 1;
    return newDigits;
}

代码简洁了一些,但是对速度、空间没有什么优化

提交结果

不知道大家有什么好的方法,分享一下吧