LeetCode-43-字符串相乘


题意描述:

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

说明:

  • num1 和 num2 的长度小于110。
  • num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

示例:

示例一:

输入: num1 = "2", num2 = "3"
输出: "6"

示例二:

输入: num1 = "123", num2 = "456"
输出: "56088"

解题思路:


代码:

Python 方法一: 一行代码。

class Solution:
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        return str(int(num1) * int(num2))

Python 方法二: 大数乘法

class Solution:
    def multiply(self, num1: str, num2: str) -> str:

        self.ans = [0 for x in range(300)]
        self.firstNumIndex = 0

        for x in range(len(num1)-1, -1, -1):
            tmp   = [0] * (len(num1)-1-x)
            carry = 0
            for y in range(len(num2)-1, -1, -1):
                last  = (int(num1[x]) * int(num2[y]) + carry) % 10;
                carry = (int(num1[x]) * int(num2[y]) + carry) // 10;
                tmp.append(last)
            if carry > 0:
                tmp.append(carry)
            #print("tmp ", tmp)
            self.add(tmp)
        #print(self.ans);

        startIndex = self.firstNumIndex
        while self.ans[startIndex] == 0 and startIndex > 0:
            startIndex -= 1

        return ''.join([str(x) for x in self.ans[:startIndex+1][::-1]])

        
    def add(self, tmp):
        carry = 0
        for x in range(len(tmp)):
            last   = (self.ans[x] + tmp[x] + carry) % 10;
            carry  = (self.ans[x] + tmp[x] + carry) // 10;
            self.ans[x] = last
            self.firstNumIndex = x
        if carry > 0:
            self.ans[len(tmp)] = carry;
            self.firstNumIndex = len(tmp)
        return

Java 方法二:大数乘法

class Solution {

    int[] ans = new int[300];
    int   firstNumIndex = 0;
    public String multiply(String num1, String num2) {
        List<Integer> tmp = new ArrayList();
        for(int i=num1.length()-1; i>=0; --i){
            tmp.clear();
            int cnt = num1.length()-1-i;
            while(cnt > 0){
                tmp.add(0);
                cnt --;
            }
            int carry = 0;
            int last  = 0;
            for(int j=num2.length()-1; j>=0; --j){
                last = ((num1.charAt(i)-'0') * (num2.charAt(j)-'0') + carry) % 10;
                carry = ((num1.charAt(i)-'0') * (num2.charAt(j)-'0') + carry) / 10;
                tmp.add(last);
            }
            if(carry > 0){
                tmp.add(carry);
            }
            this.add(tmp);
        }
        int startIndex = this.firstNumIndex;
        while(this.ans[startIndex] == 0 && startIndex > 0){
            startIndex --;
        }
        //StringBuilder ret = new StringBuilder("");
        String ret = new String("");
        while(startIndex >=0 ){
           //System.out.print(this.ans[startIndex]);
           //ret.append((char)this.ans[startIndex]);
           ret += this.ans[startIndex];
           startIndex --;
        }
        System.out.println();
        //System.out.println(ret.toString());
        return ret;
        
    }
    public void add(List<Integer> tmp){
        // 将 tmp 加到 this.ans 上去
        int last = 0;
        int carry = 0;
        for(int i=0; i<tmp.size(); ++i){
            last = (this.ans[i] + tmp.get(i) + carry) % 10;
            carry = (this.ans[i] + tmp.get(i) + carry) / 10;
            this.ans[i] = last;
            this.firstNumIndex = i;
        }
        if(carry > 0){
            this.firstNumIndex++ ;
            this.ans[this.firstNumIndex] = carry; 
        }
        return;
    }
}

易错点:

  • 一些测试样例:
"123000000000000000123"
"456"
"10000000000000000000000000001"
"101"
"9999999999999999999999999"
"9999999999999999999999999"
"9133"
"0"

  • 答案:
"56088000000000000056088"
"1010000000000000000000000000101"
"99999999999999999999999980000000000000000000000001"
"0"

总结:

  • 大数加法,大数乘法都是入门题,掌握应该不难,而且是常见的题目,可以优化一下代码,然后记一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值