LeetCode 43 Multiply Strings
来源:互联网 发布:sql是一种什么语言 编辑:程序博客网 时间:2024/05/29 10:11
题意:
输入2个表示非负数的字符串,求它们的乘积。
思路:
暴力模拟吧!!19ms能过。
我利用单个位置上数字只有10个来优化乘法次数,效率能提高到9ms。
代码:
/** * 利用数字个数优化 9ms */class Solution {public: string multiply(string num1, string num2) { if (num1.size() < num2.size()) { swap(num1, num2); } vector<int> ans{0}; vector<int> number1 = convert(num1), number2 = convert(num2); counted[1] = number1; for (int i = 0; i < number2.size(); ++i) { if (number2[i] == 0) { continue; } int b = number2[i]; if (counted[b].size() > 0) { add(ans, counted[b], i); } else { vector<int> tmp = multiply(number1, b); add(ans, tmp, i); counted[b] = tmp; } } return convert(ans); }private: vector<int> counted[10]; vector<int> convert(string num) { vector<int> number; for (int i = num.size() - 1; i >= 0; --i) { number.push_back(num[i] - '0'); } return number; } string convert(vector<int> num) { stringstream ss; bool zero = true; for (int i = num.size() - 1; i >= 1; --i) { if (zero && num[i] == 0) { continue; } else { zero = false; } ss << num[i]; } ss << num[0]; return ss.str(); } vector<int> multiply(vector<int> &num, int b) { vector<int> ans; int tmp = 0; for (int i = 0; i < num.size(); ++i) { tmp += b * num[i]; ans.push_back(tmp % 10); tmp /= 10; } if (tmp != 0) { ans.push_back(tmp); } return ans; } void add(vector<int> &num1, vector<int> &num2, int pos) { for (int i = 0; i < pos + 1 - (int)num1.size(); ++i) { num1.push_back(0); } int tmp = 0; for (int i = pos; i < num1.size() || i < num2.size() + pos; ++i) { if (i < num2.size() + pos) { if (i >= pos) { tmp += num2[i - pos]; } } else { if (tmp == 0) { break; } } if (i < num1.size()) { tmp += num1[i]; } else { num1.push_back(0); } num1[i] = tmp % 10; tmp /= 10; } if (tmp != 0) { num1.push_back(tmp); } }};/** * string转成vector<int>直接计算 19ms */class Solution {public: string multiply(string num1, string num2) { vector<int> ans{0}; vector<int> number1 = convert(num1), number2 = convert(num2); for (int i = 0; i < number1.size(); ++i) { vector<int> product = multiply(number1[i], i, number2); add(ans, product); } return convert(ans); }private: vector<int> convert(string num) { vector<int> number; for (int i = num.size() - 1; i >= 0; --i) { number.push_back(num[i] - '0'); } return number; } string convert(vector<int> num) { stringstream ss; bool zero = true; for (int i = num.size() - 1; i >= 1; --i) { if (zero && num[i] == 0) { continue; } else { zero = false; } ss << num[i]; } ss << num[0]; return ss.str(); } vector<int> multiply(int num1, int zero, vector<int> &num2) { vector<int> ans; while (zero--) { ans.push_back(0); } int tmp = 0; for (int i = 0; i < num2.size(); ++i) { tmp += num1 * num2[i]; ans.push_back(tmp % 10); tmp /= 10; } if (tmp != 0) { ans.push_back(tmp); } return ans; } void add(vector<int> &num1, vector<int> &num2) { if (num1.size() < num2.size()) { swap(num1, num2); } int tmp = 0; for (int i = 0; i < num1.size(); ++i) { tmp += num1[i]; if (i < num2.size()) { tmp += num2[i]; } num1[i] = tmp % 10; tmp /= 10; } if (tmp != 0) { num1.push_back(tmp); } }};
阅读全文
0 0
- LeetCode(43) Multiply Strings
- [leetcode 43] Multiply Strings
- [LeetCode 43]Multiply Strings
- leetcode || 43、Multiply Strings
- leetcode-43 Multiply Strings
- Multiply Strings leetcode 43
- leetcode 43: Multiply Strings
- Leetcode 43 Multiply Strings
- leetcode 43 : Multiply Strings
- Leetcode #43 Multiply Strings
- leetcode 43: Multiply Strings
- LeetCode(43) Multiply Strings
- LeetCode-43 Multiply Strings
- Leetcode#43||Multiply Strings
- [Leetcode]#43 Multiply Strings
- leetcode-43 Multiply Strings
- leetcode 43:Multiply Strings
- 【leetcode 43】--------Multiply Strings
- 记hadoop集群黑名单移除节点出现问题及解决
- 基础背包01(HDU2606,HUD3591)
- java 用poi 生成表格合并单元格放法
- Intent的那些事儿
- 【jzoj5073】【GDOI2017第三轮模拟day1】【影魔】【数据结构】
- LeetCode 43 Multiply Strings
- D3添加title提示信息时出现滚动条时,显示错位的问题
- 使用RecycleView加载不同的布局(类似淘宝京东购物车+推荐商品列表)
- LeetCode -- 120. Triangle
- ACM题集以及各种总结大全!
- ObjectARX编程(四) --------符号表简述
- 跟着阮一峰老师学习React.js
- uC/OS-III之时钟节拍列表
- 《Android群英传》笔记5——自定义View