LeetCode43:Multiply Strings

首先看到题第一种想法就是暴力解答,就是用一个字符串中的一个数字和两一个成,然后把各个字符串再拼接起来。
先贴上我的蠢方法
这个办法看起来很长也很蠢,一开始bug也很多,调了半天,还好没有超时错误,后来又参考了别人的代码,真的死的心都有了,代码少,效率高。在本文的后面附上别人的解法。慢慢提高。

class Solution {
public:
	string multiply(string num1, string num2) {
		if (num1 == "0" || num2 == "0") {
			return "0";
		}
		int n = num1.size();
		int m = num2.size();
		string max = "";
		string min = "";
		if (m<n) {
			max += num1;
			min += num2;
		}
		else {
			max += num2;
			min += num1;
		}
		vector<string>res;
		reverse(min.begin(), min.end());
		reverse(max.begin(), max.end());
		for (int i = 0; i<min.size(); i++) {
			mul(res, min[i], max);
			for (int j = 0; j<i; j++) {
				res[i].push_back('0');
			}
		}
		string out = res[0];
		for (int k = 1; k<res.size(); k++) {
			out = add(out, res[k]);
			reverse(out.begin(), out.end());
		}
		//(out.begin(), out.end());
		return out;
	}
	string add(string a, string b) {
		reverse(a.begin(), a.end());
		reverse(b.begin(), b.end());
		string out = "";
		int flag = 0;
		int i = 0;
		for (i = 0; i<a.size(); i++) {
			if (i>=b.size()) {
				int c = a[i] - '0' + flag;
				out.push_back(c % 10 + '0');
				flag = c / 10;
			}
			else
			{
				int c = (a[i] - '0') + (b[i] - '0') + flag;
				out.push_back(c % 10 + '0');
				flag = c / 10;
			}
		}
		if (i<b.size()) {
			while (i<b.size()) {
				int c = flag + (b[i++] - '0');
				flag = c / 10;
				out.push_back(c % 10 + '0');
			}
		}
		if (flag)
			out.push_back('1');
		return out;
	}
	void mul(vector<string>&res, char c, string s) {
		string str = "";
		int flag = 0;
		if (c == '0') {
			res.push_back("0");
			return;
		}
		else {
			for (int i = 0; i<s.size(); i++) {
				int cur = (c - '0')*(s[i] - '0');
				str.push_back((cur + flag) % 10 + '0');
				flag = (cur + flag) / 10;
			}
			if (flag != 0)
				str.push_back(flag+'0');
			reverse(str.begin(),str.end());
		}
		res.push_back(str);
	}
};

找到规律,我们先把两个字符串反转然后发现res[i+j]的数字是num[i]和num[j]的乘积,有些小细节就是我们先把结果存储为int类型,也不计算进位,这样就能让程序更清楚,更不容易出现bug,最后应该返回res的倒序,因为一开始填充了0,所以我们应该先把开头的0过滤掉。

	string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
		int n = num1.size();
		int m = num2.size();
		vector<int>res(n + m, 0);
		reverse(num1.begin(), num1.end());
		reverse(num2.begin(), num2.end());
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				res[i + j] = (num1[i]-'0') * (num2[j]-'0')+res[i+j];
			}
		}
		for (int k = 0; k < res.size(); k++) {
			if (k == res.size()-1) {
				break;
			}
			res[k + 1] += res[k] / 10;
			res[k] = res[k]%10;
		}
		string out = "";
		int i = res.size() - 1;
		while (res[i] == 0) --i;
		if (i < 0) return "0";
		while (i >= 0) out.push_back(res[i--] + '0');
		return out;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值