算法编程(二):加一

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

写在前面

今天我们来学习另外一道难度定义为简单的LeetCode算法题:《加一》。

这道题确实一看就懂,就是一个算法题嘛。下面就来看看我的解题思路吧。

image.png

题目解读

从这道题目上来看,是可以通过基本运算搞定的,但是题目中给出的数组长度在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;
    }
}

代码执行结果

还是挺给力的,内存方面的问题,总是避免不了。

image.png

总结

进位逻辑,只要搞清了这一点,也就没什么问题了。