小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
加一
这是力扣的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;
}
}