Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

加一

来源Leetcode第66题加一

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

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

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

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

Method 1

很简单的一道题,直接从末尾加一,携带一个进位信号carry,如果和为10,那么digits[i] %= 10 ,carry = 1,不然循环加carry即可,最后判断最高位carry是否为1,为1说明当前值为1000000,需要对数组扩容。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int[] plusOne(int[] digits) {
int len = digits.length;
int carry = 0;
for(int i = len - 1; i >= 0 ; i -- ){
if(i == len - 1){
digits[i] = digits[i] + carry + 1;
carry = 0;
}else{
digits[i] = digits[i] + carry ;
carry = 0;
}
if(digits[i] == 10){
digits[i] = 0;
carry = 1;
}
}
if(carry == 1){
digits = new int[len + 1];
digits[0] = 1;
return digits;
}
return digits;
}

简洁

写法不简洁,来自题解有一个很简洁的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
//从ditis[i] != 0这一步就判断出了进位信号的结束
//在还有进位信号的时候,末尾起每位加一
//进位结束了返回digits即可
if (digits[i] != 0) return digits;
}
//这时ditis[0] = 0,意味着原先的数是999
//因而对其扩容,ditis[0]设置为1即可
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}