题目要求:给定一个由 整数组成的非空 数组所表示的非负整数,在该数的基础上加一。
提供一个非空的整数数组,返回一个数组
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
,这个整数不会以零开头。
解法:
一开始思考的方法是,采用转换为整数的方法,再进行拆分,但由于题目要求返回一个int数组,因此仅适合数组长度在10以下的情况,因为int能表示的最大大小为21亿,当数组长度越界时会出现无法预料的情况。
class Solution {
public int[] plusOne(int[] digits) {
long initValue = 0;
int count = 0;
int[] res;
for (int i = 0; i < digits.length; i++){
initValue += (digits[i])*((long)Math.pow(10, digits.length - i - 1));//Math方法默认为double
if(digits[i] == 9){
count++;//计算数组内有几个9
}
}
long newValue = initValue + 1;
if(count == digits.length){//全是9的情况下
res = new int[digits.length + 1];
res[0] = 1;
for(int i = 1; i < digits.length + 1; i++){
res[i] = 0;
}
}else{//不全为9
res = new int[digits.length];
for(int i = 0; i < digits.length; i++){
res[i] = (int)(newValue / (long)(Math.pow(10, digits.length - i - 1)) % 10);
}
}
return res;
}
}
思路2:采用进位思想,若为9则进位carry为1,还需要再进行更高位的计算,直到无进位为止
如果数组中的所有元素都是9,类似9999,加1之后肯定会变为10000,也就是数组长度会增加1位。
如果数组的元素只要有一个不是9,加1之后直接返回即可。
class Solution {
public int[] plusOne(int[] digits) {
if(digits == null || digits.length == 0){
return null;
}
int len = digits.length;
if(digits[len - 1] != 9){
digits[len - 1]++;
return digits;
}
int carry = 1;//进位
for(int i = len - 1; i >= 0; i--){
int temp =digits[i];//记录
digits[i] = (digits[i] + carry) % 10;
carry = (temp + 1)/10;//计算是否进位,进位carry为1
if(digits[i] != 0){//计算当前是否为9,若不是可以直接返回
return digits;
}
}
//全是9的情况
int[] newDigits = new int[len + 1];
newDigits[0] = 1;
for(int i = 1; i < len + 1; i++){
newDigits[i] = 0;
}
return newDigits;
}
}
进位算法:倒序循环
carry = (temp + 1)/10;//计算是否进位,进位carry为1
digits[i] = (digits[i] + carry) % 10;//加上进位后该数字的变化
思路三:观察数是否为9,若为9,则改为0,其他全部改为+1即可
public int[] plusOne(int[] digits) {
int length = digits.length;
for (int i = length - 1; i >= 0; i--) {
if (digits[i] != 9) {
//如果数组当前元素不等于9,直接加1
//然后直接返回
digits[i]++;
return digits;
} else {
//如果数组当前元素等于9,那么加1之后
//肯定会变为0,我们先让他变为0
digits[i] = 0;
}
}
//除非数组中的元素都是9,否则不会走到这一步,
//如果数组的元素都是9,我们只需要把数组的长度
//增加1,并且把数组的第一个元素置为1即可
int temp[] = new int[length + 1];
temp[0] = 1;
return temp;
}