持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
写在前面
今天我们来学习另外一道难度定义为简单的LeetCode算法题:《加一》。
这道题确实一看就懂,就是一个算法题嘛。下面就来看看我的解题思路吧。
题目解读
从这道题目上来看,是可以通过基本运算搞定的,但是题目中给出的数组长度在1到100之间。
这就说明了只是单纯的将数组中的值输出成整数后加1,然后再转换成数组的方式行不通,因为一个整数的位数根本到不了100位。
所以,根本不能偷懒了,就可以靠着遍历数组,当然了,要倒着遍历,从最开始的加1,就可以实现逐一进位的作用了。
这其中最重要的一个特殊情况,就是最后的数组可能会比原数组的长度大一,因为随着数字进位,可能会多出一个1来。
那么如何解决这个问题,我是进行了单独处理,通过中间值来判断了一下,如果遍历完原数组后,还存在进位情况,就新建一个数组,将首位设置成1,从第二位开始,将原数组直接复制过来即可得到最终结果。
代码实现
这是我的代码实现,大家可以看一下。
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(Arrays.toString(solution.plusOne(new int[]{1, 2, 3})));
}
public int[] plusOne(int[] digits) {
boolean flag = false;
for (int i = digits.length - 1; i >= 0; i--) {
int n = digits[i];
if(i == digits.length - 1){
if(n == 9){
digits[i] = 0;
flag = true;
}else{
flag = false;
digits[i] = n + 1;
}
}else if(flag){
if(n == 9){
digits[i] = 0;
}else{
digits[i] = n + 1;
flag = false;
break;
}
}
}
if(flag){
int[] r = new int[digits.length + 1];
r[0] = 1;
System.arraycopy(digits, 0, r, 1, r.length - 1);
digits = r;
}
return digits;
}
}
代码执行结果
还是挺给力的,内存方面的问题,总是避免不了。
总结
进位逻辑,只要搞清了这一点,也就没什么问题了。