给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
问题解释:
1.这里面的单个数字:指的是每个数组元素里面,只能存储的是0,1,2,3,4,5,6,7,8,9这10个数字。
2.除了整数0之外,这个整数不会以零开头:如果有进位,该数组的首位是10,这个时候应该把数组的长度增加1,数组的开头,用两个存储单元分别存储1和0。
1.解决思路
这个题的关键在于,如果低位数字是9的话,考虑进位的问题。这个时候,之前的低为数字变为0,比它高1位的数字加1.举个例子:
输入:[9,6,2,0,0,4,6,2,4,9];
输出:[9,6,2,0,0,4,6,2,5,0]
解释:输入数组表示数字 9620046249。
我开始的思路是这样的:
(1)遍历整个数组的元素,得到该数组表示的实际数字是几
(2)把该数字加1
(3)把加1后的数字,得到每一位数字,最后存储到数组中去。
这种思路忽略了一点:计算机中int类型占4个字节,它能表示的数的最大值是2的31次方-1,即2147483647。所以,当得到的实际数字大于该值时,这种方法行不通。
我们不难发现,加1是从后往前改变数组的元素的值,当不产生进位的时候,只是改变最后一位,产生进位时,低位变成0,高位数字在原来的基础上加1,所以,我们没有必要知道这个数字到底是多大,只需要根据是否产生进位改变数组中元素的值就行。
思路2:
(1)逆序遍历该数组,判断数组中的元素大小,如果digits[i]>=9 ,把该位置元素赋值为0,否则将该位置元素加1,并退出循环。
(2)判断数组的最高为数字是否为0,若为0说明产生了进位,此时新建一个数组result,大小为digits.length+1,把result[0]赋值为1。
(3)返回result数组。
2.代码实现
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length-1; i >= 0 ; i--) {
if (digits[i]>=9 ){
digits[i] = 0;
}else {
digits[i] = digits[i]+1;
break;
}
}
int[] result = digits;
if (digits[0]==0){
result = new int[digits.length+1];
result[0] = 1;
}
return result;
}