@LeetCode 66. 加一
LeetCode 66. 加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
解题思路
非负整数加一的题其实和长整数的加法类似,其难度在于处理进位。所以当然要有进位标志了,将数组从后往前遍历,每次都给数组当前位的元素加a和count,a只有在以第一循环时才为1,其他都是0,当count为零即没有进位或数组已遍历到最高位时停止循环。循环结束后若i=-1说明此数最高位有进位。需要重新分配一个比原数组长度加一的数组用于存放运算结果。
做LeetCode数组的题时需要小心谨慎数组下标越界异常。笔者的多数错误都出自此。
代码实现加一
Java代码实现
class Solution {
public int[] plusOne(int[] digits) {
int carry=0;//保存进位
int a=1;//加数
final int b=digits.length+1;//原数组长度加一作为最高位有进位时新数组的长度
int i=digits.length-1;//数组最后一个元素下标
do{
if(digits[i]+carry+a==10){//数组的每一个加进位加a判断是否有进位
digits[i]=0;//有进位则当前为置零
carry=1;//进位指标置1;
i--;}//有进位则要将进位加至高一位
else {digits[i]+=1;return digits;}//若进位,将当前为加1返回即可
a=0; //只有最后一位需要加1,其余不需要,故置零
}while(carry==1&&i!=-1);//当无进位或数组元素已遍历完时跳出循环
if (i==-1){//i等于-1说明跳出循环的条件是数组遍历完了,也就是这个数最高位有进位,分配新数组存答案
int array[]=new int[b];
array[0]=1;
for(int j=1;j<b;j++)
{array[j]=0;
return array;}
}
return digits;
}
}
提交执行用时战胜97%的java提交记录。