「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
前言
力扣第六十六题 加一 如下所示:
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: digits = [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: digits = [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
一、思路
先理解一下题目中的意思:一个整数使用数组表示,高位在左,低位在右。然后将整数的值加一后依然使用数组来表示
既然是 加一,我们肯定要考虑到是否需要进位。当时进位也有两种情况:
- 普通进位:如
[1, 2, 3]经过加一后,结果为[1, 2, 4] - 高位溢出:如
[9, 9, 9, 9]经过加一后,数组需要扩容来处理高位溢出的情况,结果为[1, 0, 0, 0, 0]
综上所述,实现的方式大致步骤为以下几个步骤:
- 将低位的值
加一,得到进位的值,和当前的值。例如9经过加一后,进位值为1,当前的值为0 - 从右至左遍历数组,当前的值为
进位值 + digits[i]。如果i=0时,仍需要进位,则扩容再将最高位置为1即可 - 反馈数组
digits
二、实现
实现代码与思路保持一致
实现代码
public int[] plusOne(int[] digits) {
int len = digits.length;
int current = digits[len-1] + 1; // 当前计数值
int carry = current/10; // 进位
current = current - carry * 10;
for (int i=len-1; i>-1; i--) {
digits[i] = current;
if (carry == 0) {
break;
}
if (carry > 0 && i == 0) { // 处理进位
digits = new int[digits.length+1];
digits[0] = 1;
break;
}
current = digits[i-1] + carry;
carry = current/10;
current = current - carry * 10;
}
return digits;
}
测试代码
public static void main(String[] args) {
int[] digits = {9, 9};
new Number66().plusOne(digits);
}
结果
三、总结
这一题值得说明的是:千万不要遍历数组得到整数的结果后,再转为数组。这样会有溢出的风险,勿用!
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~