1. 前言:
从今天开始打卡力扣,每天一道力扣题,然后将解题思路分享出来,纯原创。
2. 题目描述
给定一个由 整数 ****组成的 ****非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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
3. 题目解析
这是一道简单题,简单来说就是把一个整数放在一个数组里面,然后对这个数进行加一操作。考察了我们对于加法进位的理解,非常简单,我们分情况进行讨论:
- 对于末尾不是 9 的数字,我们只需要把数组末尾的值加 1,再放回末尾即可。
- 对于末尾是 9 的数字,我们需要加完之后,再对末尾的前一位加1。
所以我们可以先写好以下代码:
public static int[] plusOne(int[] digits) {
for(int i= digits.length-1;i>=0;i--){
int number = digits[i];
if(number<9){
digits[i]=number+1;
break;
}else{
digits[i]=0;
}
}
return digits;
}
我们从数组的最后一位往前遍历,如果遇到 9 ,就将其设置为 0,如果不是 9 则加 1 推出循环。很好理解,如果不是 9,加完 1 之后就不需要再处理前面的数了,比如 123,对 3 进行加 1 之后,就不用对 2,进行处理了。如果遇到了 9 ,则加 1 之后是 10,留下 0,继续给前面的数加 1,例如 129,对 9 加 1 之后继续循环到 2,对 2 加 1 之后退出循环,最后结果是 130。
到这里是不是结束了呢?显然不是,我们还没有说最后一种情况,就是数组里面都是 9 怎么办?那么我们就可以在上面的基础上加上部分代码来应对这种情况了。
public static int[] plusOne(int[] digits) {
for(int i= digits.length-1;i>=0;i--){
int number = digits[i];
if(number<9){
digits[i]=number+1;
break;
}else{
digits[i]=0;
}
if (i==0){
digits = new int[digits.length+1];
digits[0] = 1;
}
}
return digits;
}
这段代码的意思是什么呢?如果当前的索引 i 为 0,则说明这个数组里的元素都是数字 9 ,被加之后变成了 0 ,为什么这么推断?
因为如果不是 9,那么肯定被加 1 然后 break了,根本执行不到这里,能执行到这里的都是 9 被加 1 变成了 0 ,由于此时是第一个元素,说明从末尾到第一个元素都是 9,有可能是 9、99、999等等,此时只需要把这个数组的长度+1,然后将索引为 0 的位置设置为 1 即可。