leetcode算法—[415][2][67]大数相加系列问题

2021-07-11  本文已影响0人  小胖学编程

有一类型的题目是模拟数学运算,完成二进制、十进制、十六进制的转换。关键算法在于取余和除两个数学操作的运用。

1. 相似题型

1.1 大数相加

415. 字符串相加

image.png

1.2 整数反转

leetcode算法—整数反转(简单)

1.3 二进制求和

67. 二进制求和

image.png

2. 总结

核心算法在于:
进位值=(两个字符串的最后一位相加+进位值)/对应进位;
本位值=(两个字符串的最后一位相加+进位值)%对应进位;

算法比较简单,说一下自己的bug:

1. 两个字符串长度不同

例如100 和 10相加,最终的值为110。即个位+个位,十位+十位。
反应在编程中是:字符串对应的末尾相加

但是我开始的思路:第一个for循环处理两个字符串的公共部分,长的字符串多出来的一部分在使用一个for循环处理。
遇到的问题:循环的边界情况复杂,且这样实现代码逻辑复杂。

然后转变思路,当方法进入后,便使用一个循环进行对短字符串补0操作,直至两个字符串长度相等。然后在使用一个for循环完成除和取余的操作
不足之处:代码不够简洁,可以仅使用一个for循环完成操作;

但是两个字符串长度并不相同,如何使用一个循环来控制两个字符串中字符值的获取?

再次转变思路,使用一个for循环进行处理时,两个字符串的末尾字符的位置并不相同。for循环次数的作用便仅仅控制两个字符串相加多少次。而获取字符串对应的字符位置,需要单独处理。

循环结束后,多于的进位没有处理

比如99+10,循环计算两次,得到的值为09,进位1还没有进行拼接,所以在最终返回时,要判断进位是否为0,然后在做最终处理返回。

3. 最终代码

class Solution {

    /**
     * 09:00    info
     * 解答成功:
     * 执行耗时:15 ms,击败了5.76% 的Java用户
     * 内存消耗:39.1 MB,击败了5.04% 的Java用户
     */
    public String addStrings(String num1, String num2) {
        char[] nc1 = num1.toCharArray();
        char[] nc2 = num2.toCharArray();
        //遍历-低位相加
        //获取到最大遍历个数

        //最大遍历的次数
        int max = nc1.length > nc2.length ? nc1.length : nc2.length;
        //两个集合分别遍历的开始位置
        int nl1 = nc1.length - 1;
        int nl2 = nc2.length - 1;

        //进位
        int h = 0;
        String r = "";
        for (int i = max - 1; i >= 0; i--) {
            //分别获取两个字符数组的最后一位
            int ni1 = nl1 < 0 ? 0 : Integer.valueOf(nc1[nl1] + "");
            int ni2 = nl2 < 0 ? 0 : Integer.valueOf(nc2[nl2] + "");

            int sum = ni1 + ni2 + h;

            h = sum / 10;
            r = sum % 10 + r;
            nl1--;
            nl2--;
        }
        //最后可能依旧存在进位
        return h != 0 ? h + r : r;

    }
}
上一篇 下一篇

猜你喜欢

热点阅读