文章目录
- 一、题目描述
- 1.1 题目
- 1.2 知识点
- 1.3 题目链接
- 二、解题思路
- 2.1 自研思路
- 2.2 示例思路
- 三、实现代码
- 3.1 自研实现
- 3.2 示例代码
一、题目描述
1.1 题目
- 加一
- 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。 - 示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
- 示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
1.2 知识点
- 数组
1.3 题目链接
二、解题思路
2.1 自研思路
自己的解题思路简单,就是每一位都进行加一操作,然后记录下是否需要进位的信息,在对下一位处理的时候直接加上进位就可以了,需要注意的是当进位为 0 时,就可以直接跳出遍历返回了,因为此时前面的高位都不会再发生变化了,还有就是对于 [9] 这种进位情况的处理,需要在遍历完原数组后,创建一个新的比元素组长度大一的数组来记录新的结果(因为包含一个新的进位)。
2.2 示例思路
实例代码跟我的思路是差不多的,但是实例代码更简洁一些,并且存在优化操作。具体思路如下(LeetCode 题解):
根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:
(1)除 99 之外的数字加一;
(2)数字 99。
加一得十进一位个位数为 00 加法运算如不出现进位就运算结束了且进位只会是一。所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 11 个位数置为 00,如此循环直到判断没有再进位就退出循环返回结果。然后还有一些特殊情况就是当出现 9999、999999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。
代码中比较巧妙的一步是 digits = new int[digits.length + 1];
,对于需要进位而申请新数组的操作,该题解中没有采用创建一个新的数组,然后将所有原数组中的元素拷贝过去的方式,而是直接将最高位置 1 即可,如 [9,9] 或 [9,9,9] 加一后必为 [1,0,0] 或 [1,0,0,0] ,即只有最高位为 1 ,其余位均为 0 ,妙哉。
三、实现代码
3.1 自研实现
class Solution {
public int[] plusOne(int[] digits) {
int cout = 1;
for(int i = digits.length-1; i >= 0; i--){
int sum = digits[i] + cout;
digits[i] = sum%10;
cout = sum/10;
if(cout == 0) return digits;
}
if(cout == 1){
int[] res = new int[digits.length+1];
res[0] = 1;
for(int i = 0; i < digits.length; i++)
res[i+1] = digits[i];
return res;
}
return digits;
}
}
3.2 示例代码
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
if (digits[i] != 0) return digits;
}
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}