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;
}
代码简洁了一些,但是对速度、空间没有什么优化
提交结果
不知道大家有什么好的方法,分享一下吧