字符串相加和相乘-手撕
看到牛油分享的面经。
实现两个大数的相加,输入的都是字符串,从两个字符串的末尾开始进行遍历模拟,时间复杂度是 O(N)级别的.一个长度比较长,一个长度比较小,通过三元运算符,长度小于 0 的时候,对应的位数直接赋值为 0。利用双指针的思想来解决这个问题。
public String addStrings(String num1, String num2) {
int len1 = num1.length() - 1;
int len2 = num2.length() - 1;
int carry = 0;
StringBuffer sb = new StringBuffer();
while (len1 >= 0 || len2 >= 0) {
int x = len1 >= 0 ? num1.charAt(len1) - '0' : 0;
int y = len2 >= 0 ? num2.charAt(len2) - '0' : 0;
int cur = x + y + carry; //当前的
carry = cur / 10;
len1--;
len2--;
sb.append(cur % 10);
}
if (carry != 0) {
sb.append(carry);
}
return sb.reverse().toString();
}
大数向乘 模拟两个字符串相乘,用一个数组来保存临时的数据,最后再从末尾开始处理数组,数组长度等于两个字符串长度之和。
//大数相乘
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int len1=num1.length();
int len2=num2.length();
int m=len2+len1;
int[] arr =new int[len1+len2];
for (int i = num1.length()-1; i >=0 ; i--) {
int x=num1.charAt(i) - '0';
for (int j = num2.length()-1; j >=0 ; j--) {
int y=num2.charAt(j) - '0';
arr[i+j+1]=arr[i+j+1]+x*y;
}
}
for (int i = m-1; i>0; i--) {
arr[i-1]+=arr[i]/10;
arr[i]=arr[i]%10; //刚开始这个漏掉了 a[i]需要和10进行取模
}
StringBuffer sb = new StringBuffer();
int index=arr[0]==0?1:0;
for (int i=index; i<arr.length; i++) {
sb.append(arr[i]);
}
return sb.toString();
}
#字符串相加和相乘-手撕##面试手撕#牛牛的算法专栏 文章被收录于专栏
牛牛的算法专栏,记录一些算法题