题目描述
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plus-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
就是做简单的加法运算。给数组最后一个数字加一,如果结果大于9,发生进位,最后一个数字赋值为0,进位标志位jinwei
置1。然后把这个标志位加到倒数第二个数字,看是否发生进位,如果还是进位,重复上述操作;如果不进位,直接返回结果。
我的程序(Java)
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
// 因为数组非空,所以数组长度至少为1
if(len == 1){
int num = digits[0];
if(num < 9)
return new int[]{num + 1};
else // 数字为9,,加一发生进位
return new int[]{1, 0};
}
int jinwei = 0;
if(digits[len - 1] < 9) // 最后一位小于9,加一不发生进位,直接返回
{
digits[len - 1] += 1;
return digits;
}
else{ // 最后一位等于9,加一进位
digits[len - 1] = 0;
jinwei = 1;
}
for(int i = len - 2; i >= 0; i--){
int num = digits[i];
if(num + jinwei <= 9) // 当不再发生进位时,直接返回
{
digits[i] = num + jinwei;
return digits;
}
else{
digits[i] = 0;
jinwei = 1;
}
}
int[] longDigits = new int[digits.length + 1]; // 最高位发生进位,构造新的数组,长度在原来数组的基础上加一
longDigits[0] = 1; // 最高位为0
for(int i = 1; i < longDigits.length; i++){ // 后面依次把digits的数复制到新数组中
longDigits[i] = digits[i - 1];
}
return longDigits;
}
}
上述思路其实可以更简单地实现:来自黄凯剑
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
if (digits[i] != 9) { // 不等于9,不进位,加一返回
digits[i]++;
return digits;
}
digits[i] = 0; // 进位
}
//跳出for循环,说明数字全部是9
int[] temp = new int[digits.length + 1];
temp[0] = 1;
return temp;
}
}
还有类似的解法:YHHZW
大佬们真厉害,学习了!
如有不当之处,还请读者批评指正!