lt.415- 字符串相加
[案例需求]
[思路分析]
- sum = left + right + carry;
- 本道题需要注意的无外乎两点:
- 进位;初始值为0, 延迟到下一次加法运算时加入
- 两个数不等长时的长度判断. 这里最好的方法是采用三元表达式: 当其中一个子串遍历结束后, 让他的加数为0, 否则就是string.charAt(i)
[代码实现]
class Solution {
public String addStrings(String num1, String num2) {
char[] num1Arr = num1.toCharArray();
char[] num2Arr = num2.toCharArray();
int carry = 0;
int sum = 0;
StringBuilder sb = new StringBuilder();
int left = num1Arr.length - 1;
int right = num2Arr.length - 1;
while(left >= 0 || right >= 0 || carry != 0){
int leftNum =left >= 0 ? num1Arr[left] - '0' : 0;
int rightNum = right >= 0 ? num2Arr[right] - '0' : 0;
sum = leftNum + rightNum + carry; // 左加数 + 右加数 + 进位
sb.append(sum % 10); // 添加加数上的个位数字
carry = sum / 10; // 获取本次相加时的进位值 (十位数)
--left;
--right;
}
return sb.reverse().toString();
}
}
lt-43. 字符串相乘
[案例分析]
[思路分析]
[代码示例]
class Solution {
public String multiply(String num1, String num2) {
//相乘计算
int leftLength = num1.length();
int rightLength = num2.length();
if (num1.charAt(0) == '0' || num2.charAt(0) == '0') return "0";
// int multi = 0;
//int carry = 0;
String res = "0";
//进位
int carry = 0;
// 遍历down 的数字 , 竖式相乘后前缀补0后相加
for(int j = rightLength - 1; j >= 0; j--){
//temp保留相乘的结果
StringBuilder temp = new StringBuilder();
//实现补零, 这样把乘积反转了再相加
// 为什么 rightLength - 1 - i, 高位的需要更多补零
//如: 123
// X 456
// -------- 在StringBuilder是这样存储的
// 738 837 第一次遍历
// 6150 ---> 补了一个零 ===> 0561 第二次遍历 ==> 后续我们需要把每一次遍历的数进行反转,
// 49200 ---> 补了两个零 00294 第三次遍历 然后再相加
for(int k = 0; k < rightLength - 1 - j; k++){
temp.append(0);
}
//每一次相乘.
//外层for循环遍历的是下面数(如456中的6,,5,,4)
//内层for循环遍历上面的每个数并与j相乘, 主义是倒序相乘
//获取竖式下面的那个数(倒序)
int right = num2.charAt(j) - '0';
for(int i = leftLength - 1; i >= 0 || carry != 0; i--){
// 获取竖式上面的那个数(倒序)
int left = i < 0 ? 0 : num1.charAt(i) - '0';
int product = right * left + carry;
temp.append(product % 10);
carry = product / 10;
}
//当前sb中的竖式乘积结果和刚计算到的竖式乘积结果相加
res = addString(res, temp.reverse().toString());
}
//
return res;
}
///两个字符串相加, 返回一个字符串
public String addString(String leftString, String rightString){
int lefLen = leftString.length();
int rightLen = rightString.length();
int i = lefLen - 1, j = rightLen - 1, carry = 0;
StringBuilder sb = new StringBuilder();
while(i >= 0 || j >= 0 || carry != 0){
int left = i < 0 ? 0 : leftString.charAt(i) - '0';
int right = j < 0 ? 0 : rightString.charAt(j) - '0';
int sum = carry + left + right;
//存储个位数
sb.append(sum % 10);
//存储进位
carry = sum / 10;
--i;
--j;
}
return sb.reverse().toString();
}
}
[思路二, 对普通竖式计算的优化]
- 待补充