问题描述
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例
分析
题目意为给你一个数,你需要将这个数加一然后返回。只不过这个数是以数组的形式给你的,即该数的最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。那么自然就能想到加一操作是从数字的最后一位开始加的,所以从数组的最后一位开始遍历。
这里需要考虑几种情况。首先,如果数组最后一位的数字加一是小于10的,那么这种情况是不需要进位的直接将数组最后一位的数字加一返回数组便可以了。
可是最后一位数字是9呢?那么此时加一是需要进位的,可以想到进位之后数组当前下标的数字就变成了0。那么在代码中加一操作可以使用(digits[i] + 1) % 10来执行,这样的话如果加一结果是小于10的,那么结果就是加一的结果。假如结果等于10需要进位,那么当前下标的数字就变成了0。
所以在程序中我们可以直接判断加一操作之后,数组当前下标的数字是否等于零,不等于零则代表没有产生进位直接返回就行。
最后还有一种极端情况,就是数组中的数字全是9。不难想象这种情况下加一那么最终得数的长度将比原数组要长1位。因为原数组中的每个数字都会产生进位。此时就需要new一个长度比原数组长1位的新数组并将下标赋值为1就行。
代码实现
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i > -1; i--) {
//最后一个数字加一取余,如果相加小于10则不变,如果等于10则该位被赋值为0
//从第二次循环到这里时,加一就意味着加的是前一位的进位
digits[i] = (digits[i] + 1) % 10;
if (digits[i] != 0) //如果当前位加一取余之后不等于0的话,就意味着没有产生进位所以直接可以返回
return digits;
}
//如果前面的代码没有返回,一直执行到了这一步,就意味着输入数组的最高位也需要进位
//那么直接new一个比原来数组长度加一的新数组,然后将下标0的位置赋值为1
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}