一、问题描述
Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.
You may assume the integer do not contain any leading zero, except the number 0 itself.
The digits are stored such that the most significant digit is at the head of the list.
二、我的思路
就像列竖式做加法一样,一个int add记录当前位是否要加,如果add位是0的话,就停止加法。
代码如下,在最高位进位的地方借鉴了discuss里的技巧:
class Solution {
public int[] plusOne(int[] digits) {
int add = 1;
for(int i = digits.length - 1; i >= 0; i --){
if(add != 1){
break;
}
if(digits[i] == 9){
digits[i] = 0;
add = 1;
}
else{
digits[i] += 1;
add = 0;
}
}
if (digits[0] == 0) {
int[] res = new int[digits.length+1];
res[0] = 1;
return res;
}
return digits;
}
}
三、淫奇技巧
1)
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >=0; i--) {
if (digits[i] != 9) {
digits[i]++;
break;
} else {
digits[i] = 0;
}
}
if (digits[0] == 0) {
int[] res = new int[digits.length+1];
res[0] = 1;
return res;
}
return digits;
}
很好的利用了题目假设。题目假设最高位不会是0,除非这个数就是0。
在做完加法以后,判断最高位是否进位了。如果最高位是0,说明之前这个数是9999...9, 加一以后后面的数字全部是0. 所以只需要在最高位补1即可。
另外相比我的加法计算方法,人家写的太简洁了!!
2)和上面的相同的思路,不过更绝~
public int[] plusOne(int[] digits) {
int n = digits.length;
for(int i=n-1; i>=0; i--) {
if(digits[i] < 9) {
digits[i]++;
return digits;
}
digits[i] = 0;
}
int[] newNumber = new int [n+1];
newNumber[0] = 1;
return newNumber;
}
四、举一反三
如果不是加1而是加n呢?加法运算部分if判断条件也要改变一下。最后的淫奇技巧就不能用了。是否可以改变下条件继续神奇呢?如果动态调整的话怎么办呢?(to be continued。。。)
五、碎碎念
简单的题目,还是能看出很大的差距呀~继续加油!