每日一解 字符串相乘

题目 字符串相乘

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

示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”

说明:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings

思路

最开始能想到的简单思路就是模拟乘法运算。例如123乘456,就可以模拟成:

123 * 6 + 123 * 50 + 123 * 400

这样模拟一个很重要的原因就是不准用大数类型,那么要自己写相乘和相加,时间复杂度为O(n·m),n和m为字符串的长度。
然后看了看官解有没有优化,思路和这个模拟思路是没有什么差别的,但是官解使用数组来存储运算结果,这样的话就不用写大数类型相加了,主要是可以降低代码复杂度。

代码实现

class Solution {
    
    
public:
	string multiply(string num1, string num2) {
    
    
		vector<char> sum(num1.size() + num2.size(), '0');
		for (int i = num1.size() - 1; i >= 0; i--) {
    
    
			int n1 = num1[i] - 48;
			int jinwei = 0;
			for (int j = 0; j < num2.size(); j++) {
    
    
				int n = n1 * (num2[num2.size() - j - 1] - 48) + jinwei;
				int m = sum[i + num2.size() - j] - 48;
				n += m;
				sum[i + num2.size() - j] = (n % 10) + 48;
				jinwei = n / 10;
			}
			int pos = i;
			while (jinwei) {
    
    
				int n = sum[pos] - 48;
				n += jinwei;
				jinwei = n / 10;
				sum[pos] = n + 48;
				pos--;
			}
		}
		string answer;
		int count = 0;
		while (count < sum.size() && sum[count] == '0') {
    
    
			count++;
		}
		if (count == sum.size()) {
    
    
			return "0";
		}
		while (count < sum.size()) {
    
    
			answer += sum[count++];
		}
		return answer;
	}
};

代码双85左右,还行吧。主要是进位问题,比如前一位运算后得到的是9999,此时加了一个3进来,那么会造成不断循环的进位,这个进位的处理是比较需要注意的。

猜你喜欢

转载自blog.csdn.net/new_DYX/article/details/107972273