- 浏览: 137548 次
文章分类
- 全部博客 (189)
- Tree (14)
- Dynamic Programming (34)
- Array (20)
- Search (1)
- Hash (12)
- Backtracking (22)
- Divide and Conque (8)
- Greedy (6)
- Stack (12)
- software (0)
- List (7)
- Math (22)
- Two pointers (16)
- String (20)
- Linux (1)
- Sliding Window (4)
- Finite State Machine (1)
- Breadth-first Search (7)
- Graph (4)
- DFS (6)
- BFS (3)
- Sort (9)
- 基础概念 (2)
- 沟通表达 (0)
- Heap (2)
- Binary Search (15)
- 小结 (1)
- Bit Manipulation (8)
- Union Find (4)
- Topological Sort (1)
- PriorityQueue (1)
- Design Pattern (1)
- Design (1)
- Iterator (1)
- Queue (1)
最新评论
-
likesky3:
看了数据结构书得知并不是迭代和递归的区别,yb君的写法的效果是 ...
Leetcode - Graph Valid Tree -
likesky3:
迭代和递归的区别吧~
Leetcode - Graph Valid Tree -
qb_2008:
还有一种find写法:int find(int p) { i ...
Leetcode - Graph Valid Tree -
qb_2008:
要看懂这些技巧的代码确实比较困难。我是这么看懂的:1. 明白这 ...
Leetcode - Single Num II -
qb_2008:
public int singleNumber2(int[] ...
Leetcode - Single Num II
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
[分析] Naive的做法是模拟笔算乘法操作,从高位到低位的顺序将num2 上的每一位同num1 相乘,由于运算顺序从高到低,每次运算时将上一次运算结果后加0,(相当于*10)后同本次乘积结果加和。 高效做法(Method 2)思路:num1 * num2, num2上的每一位依次和num1中的每一位相乘,num2的个位同num1的个位相乘结果包含在最终乘积的个位上,同理num2的个位同num1的十位相乘结果包含在最终乘积的十位上,num2的十位同num1的个位相乘结果也包含在最终乘积的十位上,一般的,num2的第 i 位 同num1的第 j 位相乘结果包含在最终乘积的第 i + j 位,遍历两个数的每一位,可以得到最终乘积各位上的结果。这样得到的乘积各位上可能是两位数,因此还需要处理使得乘积结果各位上为单个数字,处理方式就是依次进位。Method 1有O(m * n)次 *、\、% 以及字符串append操作, O(m * (m + n))次 +, append操作,而Method 2仅有O(m * n)次 *、+ 以及O(m + n)次 \、%、append操作,我们知道除法和取模是最耗时的,所以前者超时也就不难怪了。
Note: The numbers can be arbitrarily large and are non-negative.
[分析] Naive的做法是模拟笔算乘法操作,从高位到低位的顺序将num2 上的每一位同num1 相乘,由于运算顺序从高到低,每次运算时将上一次运算结果后加0,(相当于*10)后同本次乘积结果加和。 高效做法(Method 2)思路:num1 * num2, num2上的每一位依次和num1中的每一位相乘,num2的个位同num1的个位相乘结果包含在最终乘积的个位上,同理num2的个位同num1的十位相乘结果包含在最终乘积的十位上,num2的十位同num1的个位相乘结果也包含在最终乘积的十位上,一般的,num2的第 i 位 同num1的第 j 位相乘结果包含在最终乘积的第 i + j 位,遍历两个数的每一位,可以得到最终乘积各位上的结果。这样得到的乘积各位上可能是两位数,因此还需要处理使得乘积结果各位上为单个数字,处理方式就是依次进位。Method 1有O(m * n)次 *、\、% 以及字符串append操作, O(m * (m + n))次 +, append操作,而Method 2仅有O(m * n)次 *、+ 以及O(m + n)次 \、%、append操作,我们知道除法和取模是最耗时的,所以前者超时也就不难怪了。
// method 2: public String multiply(String num1, String num2) { if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0) return null; if (num1.length() < num2.length()) return multiply(num2, num1); if (num2.equals("0")) return "0"; if (num2.equals("1")) return num1; int[] result = new int[num1.length() + num2.length() - 1]; for (int i = num2.length() - 1; i >= 0; i--) { int digit1 = num2.charAt(i) - '0'; for (int j = num1.length() - 1; j >= 0; j--) { result[i + j] += digit1 * (num1.charAt(j) - '0'); } } int carry = 0; for (int i = result.length - 1; i >= 0; i--) { result[i] += carry; carry = result[i] / 10; result[i] %= 10; } StringBuilder val = new StringBuilder(); if (carry > 0) val.append(carry); for (int i = 0; i < result.length; i++) val.append(result[i]); return val.toString(); } // method 1 : public String multiply1(String num1, String num2) { if (num1 == null || num2 == null || num1.length() == 0 || num2.length() == 0) return null; String result = ""; for (int i = 0; i < num2.length(); i++) { result = add(result + '0', multiOneDigit(num1, num2.charAt(i) - '0')); } return result; } private String add(String num1, String num2) { if (num1.length() < num2.length()) { String tmp = num2; num2 = num1; num1 = tmp; } StringBuilder sum = new StringBuilder(); int carry = 0, val = 0; int i = num1.length() - 1, j = num2.length() - 1; while (j >= 0) { val = (num1.charAt(i) - '0') + (num2.charAt(j) - '0'); sum.append(val - 10); // val % 10 carry = val >= 10 ? 1 : 0; // val / 10 i--; j--; } while (i >= 0) { val = (num1.charAt(i--) - '0') + carry; sum.append(val - 10); carry = val >= 10 ? 1 : 0; } if (carry > 0) sum.append(carry); return sum.reverse().toString(); } private String multiOneDigit(String num1, int num2) { StringBuilder result = new StringBuilder(); int carry = 0, val = 0; for (int i = num1.length() - 1; i >= 0; i--) { val = (num1.charAt(i) - '0') * num2 + carry; result.append(val % 10); carry = val / 10; } if (carry > 0) result.append(carry); return result.reverse().toString(); }
发表评论
-
Leetcode - Integer to English Words
2015-09-04 20:53 1104[分析] 这题通过率之所以非常低是因为有很多corner ca ... -
Leetcode - Strobogrammatic Number III
2015-09-03 16:45 2179A strobogrammatic number is a n ... -
Leetcode - Read N Characters Given Read4 II - Call Multiple Times
2015-08-28 09:00 852The API: int read4(char *buf) r ... -
Leetcode - Read N Characters Given Read4
2015-08-27 20:56 691The API: int read4(char *buf) r ... -
Leetcode - One Edit Distance
2015-08-27 20:26 542[分析] 两字符串相同或者长度差异大于等于2都不符合要求,只需 ... -
Leetcode - Basic Calculator II
2015-08-27 09:16 906mplement a basic calculator to ... -
Leetcode - Factorial Trailing Zeroes
2015-08-25 09:00 430[思路] 数乘积结果的后缀0,其实就是数结果中有多少个因子10 ... -
Leetcode - Ugly Number II
2015-08-24 22:54 1163[分析] 暴力的办法就是从1开始检查每个数是否是丑数,发现丑数 ... -
Leetcode - Excel Sheet Column Title
2015-08-24 10:24 641[分析] 十进制转26进制,需要注意的是26进制是以1为最小数 ... -
Leetcode - Max Points on a Line
2015-08-23 15:30 724[分析] 两条直线若包含一个公共点且斜率相同,则为同一条直线。 ... -
Leetcode - Fraction to Recurring Decimal
2015-08-23 10:05 468[分析] 处理int型整数运算时,为避免溢出,省事的做法就是内 ... -
Leetcode - Isomorphic Strings
2015-08-23 09:51 547[分析] 思路1:维护两个哈希表,char[] map, bo ... -
Leetcode - Group Shifted String
2015-08-22 16:20 1728Given a string, we can "sh ... -
Leetcode - Count Primes
2015-08-22 13:42 511[ref] https://en.wikipedia.org/ ... -
Leetcode - Strobogrammatic Number
2015-08-22 10:48 1092A strobogrammatic number is a n ... -
Leetcode - Add Binary
2015-08-21 09:28 470[分析] 从低位往高位逐位相加,就是这么一个简单的题却花了我一 ... -
Leetcode - Rotate Image
2015-08-19 19:51 500[分析] 自己的思路:从外到内一圈圈顺时针旋转90度,坐标映射 ... -
Missing Ranges
2015-08-19 09:48 515[分析] 此题若不考虑极大值极小值相关的corner case ... -
Leetcode - Bitwise AND of Number Range
2015-08-17 09:41 507Given a range [m, n] where 0 &l ... -
Leetcode - Pow(x, n)
2015-08-11 09:45 465[分析] 数值计算类型题目,二分法或者借助位运算,本题两种方法 ...
相关推荐
- String to Integer (atoi): 将字符串转换为整数,需要处理各种边界情况,例如溢出、非法输入等。 - Reverse Integer: 将一个整数反转。在处理大数时需要注意溢出问题。 - Regular Expression Matching: 给定一个...
* [String](https://github.com/kamyu104/LeetCode#string) * [Linked List](https://github.com/kamyu104/LeetCode#linked-list) * [Stack](https://github.com/kamyu104/LeetCode#stack) * [Queue]...
Leetcode扑克 Leetcode Starting from 2020/08/02 Leetcode practice with Python (for now) Daily Challenge + Selected Questions From Using Leetcode Plugin for Solutions ...String ...Multiply S
String to Integer(atoi) :star: :star: :star: 注意细节,溢出 ---- strlen :star: :star: :star: const char,size_t类型 ---- strcpy :star: :star: :star: 字符串复制,返回值,赋值语句 0028 strStr :star: :...
#include <string.h> char* multiply(char* num1, char* num2) { int len1 = strlen(num1), len2 = strlen(num2); if (len1 == 0 || len2 == 0) return "0"; // 初始化二维数组存储中间结果 int arr[len1 + ...
multiply 字符串相乘 reverseWords 翻转字符串里的单词 simplifyPath 简化路径 restoreIPAddresses 复原IP地址 threeSum 三数之和 search 搜索旋转排序数组 1. 3. 9. 75. 209. 219. 167. 268. 344. 349. 454. 447. ...
Multiply Strings 066 Add Binary Linked-list 002 Add Two Numbers Stack 020 Valid Parenthesis Hash Table 001 TwoSum Reference 完整的学习流程 How to be a softwair engineer: 其他人详解 Python的各式演算法
string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; int len1 = num1.length(), len2 = num2.length(); vector<int> res(len1 + len2, 0); for (int i = len1 - 1; ...