题解 | #大数加法#

大数加法

http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

算法思想一:模拟法

解题思路:

算法流程: 
    设定 i,j 两指针分别指向 s,t 尾部,模拟人工加法;
    计算进位: 计算 carry = tmp // 10,代表当前位相加是否产生进位;
    添加当前位: 计算 tmp = n1 + n2 + carry,并将当前位 tmp % 10 添加至 res 头部;
    索引溢出处理: 当指针 i或j 走过数字首部后,给 n1,n2 赋值为 0,相当于给 s,t 中长度较短的数字前面填 0,以便后续计算。
    当遍历完 s,t 后跳出循环,并根据 carry 值决定是否在头部添加进位 1,最终返回 res 即可。

代码展示:

Python版本
class Solution:
    def solve(self , s , t ):
        # write code here
        res = ""
        i, j, carry = len(s) - 1, len(t) - 1, 0
        while i >= 0&nbs***bsp;j >= 0:
            n1 = int(s[i]) if i >= 0 else 0
            n2 = int(t[j]) if j >= 0 else 0
            tmp = n1 + n2 + carry
            carry = tmp // 10
            res = str(tmp % 10) + res
            i, j = i - 1, j - 1
        return "1" + res if carry else res

复杂度分析:

时间复杂度O(max(lens, lent)):lens = s.length(), lent = t.length(),取决于长度较长的字符串
空间复杂度O(1):常数级空间存储

算法思想二:栈

解题思路:

只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,从低到高逐位相加,如果当前位和超过 10,则向高位进一位
定义两个指针 i 和 j 分别指向 s 和 t  的末尾,即最低位,同时定义一个变量 add 维护当前是否有进位,然后从末尾到开头逐位相加即可。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理
主要思想和算法思想一相差不大,只是在将每一位的相加结果入栈存储,当循环完之后再将栈中数据依次出栈形成字符串

代码展示:

JAVA版本
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        StringBuilder stringBuilder = new StringBuilder();
        int i = s.length() - 1, j = t.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) {
            carry += i >= 0 ? s.charAt(i--) - '0' : 0;
            carry += j >= 0 ? t.charAt(j--) - '0' : 0;
            stack.push(carry % 10);
            carry = carry / 10;
        }
        while (!stack.isEmpty())
            stringBuilder.append(stack.pop());
        return stringBuilder.toString();
    }
}

复杂度分析:

时间复杂度O(max(lens, lent)):lens = s.length(), lent = t.length(),取决于长度较长的字符串
空间复杂度O(1):常数级空间存储

全部评论
java版写的真好
4 回复 分享
发布于 2021-10-23 18:27
&nbs***bsp;就是or
2 回复 分享
发布于 2022-02-22 11:18
用栈了的话就不是常数级的空间复杂度了吧,至少会存储最长的字符串。
1 回复 分享
发布于 2022-08-31 17:34 重庆
很好
点赞 回复 分享
发布于 2021-10-27 20:55
BigDecimal 多好
点赞 回复 分享
发布于 2022-05-28 22:04
homo特有的输入用例(
点赞 回复 分享
发布于 2022-09-06 17:52 浙江

相关推荐

评论
47
23
分享
牛客网
牛客企业服务