[抄题]:
以字符串的形式给出两个非负整数 num1
和 num2
,返回 num1
和 num2
的和。 比如一个50位+一个100位。
给定 num1 = "123"
,num2 = "45"
返回 "168"
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- sum求和或者循环退出的条件都是i j >= 0,因为是从后往前做减法的,二者中只要有一个数不为0就要继续操作,因此为或。第一次见。位数-1直到没有为止。不熟悉其思想。
- 字母 - 字母'0'= 原本的数字,以前都没有理解
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
- 套路模板:求sum,取%取/,加上carry
- 新加的位数应该放在前面而不是后面,定式思维了
[复杂度]:Time complexity: O(n) Space complexity: O(1)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
- 一句分号结束的话只能声明一个数据类型int, 不能两个(一个分号一个int)
int m;
int n;可以
int m, n;可以
int m , int n;一句分号结束的话声明了2个数据类型int,不行
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
2. Add Two Numbers反向加数:也是数字游戏
[代码风格] :
public class Solution {
/**
* @param num1: a non-negative integers
* @param num2: a non-negative integers
* @return: return sum of num1 and num2
*/
public String addStrings(String num1, String num2) {
String ans = "";
int carry = 0;// i or j//?
for (int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0; i--, j--) {
int sum = carry;
sum += (i >= 0) ? num1.charAt(i) - '0': 0;
sum += (j >= 0) ? num2.charAt(j) - '0': 0;
ans = sum % 10 + ans;
carry = sum / 10;
} if (carry != 0) {
ans = carry + ans;
} return ans;
}
}
[抄题]:
给定两个二进制字符串,返回他们的和(用二进制表示)。
a = 11
b = 1
返回 100
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
[一句话思路]:
同上,把除数改成2了
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 字符串是无法新建类型的,所以直接初始化为空串“”即可
- i, j 都是从最后一位开始,倒序相加的
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
[复杂度]:Time complexity: O() Space complexity: O()
[英文数据结构或算法,为什么不用别的数据结构或算法]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :