LeetCode66.加一
题目描述
/**
*
* 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
* <p>
* 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
* <p>
* 你可以假设除了整数 0 之外,这个整数不会以零开头。
*
*/
思路分析
- 用数组模拟一个非负整数,然后对其进行加一计算,实质还是一个整数的加法运算
- 定义变量carry保存每次计算后的进位,然后将进位和下一次高位的计算相加,将 计算的结果继续保存到原数组,可减少空间的消耗
- 在数组所有位都进行完计算后,判断有没有向最高位的进位,如果没有,直接返回原数组,否则需要创建新数组,保存最高位进位和低位
- 源码及详解见下
源码及分析
/**
*
* @param digits 要进行加一运算的数组
* @return 返回计算后的结果
*/
public int[] plusOne(int[] digits) {
//定义变量 carry保存进位
int carry = 0;
//数字的最低位先加一
int sum = digits[digits.length - 1] + carry + 1;
//将计算的结果再保存到原位置
digits[digits.length - 1] = sum % 10;
//并保存计算后是否有进位
carry = sum / 10;
//然后从次低位开始计算,同样将计算的结果保存到原位置
for (int i = digits.length - 2; i >= 0; i--) {
digits[i] = sum % 10;
carry = sum / 10;
}
//循环结束后判断最高位有没有进位,如果没有进位,直接结束
if (carry == 0) {
return digits;
} else {
//如果有进位,需要将进位也加进去,需要创建一个新数组,保存最高位进位和低位结果
int[] arr = new int[digits.length + 1];
arr[0] = carry;
for (int i = 0, j = 1; i < digits.length; i++, j++) {
arr[j] = digits[i];
}
return arr;
}
}