字符串相加和相乘-手撕
看到牛油分享的面經(jīng)。
實(shí)現(xiàn)兩個(gè)大數(shù)的相加,輸入的都是字符串,從兩個(gè)字符串的末尾開始進(jìn)行遍歷模擬,時(shí)間復(fù)雜度是 O(N)級(jí)別的.一個(gè)長(zhǎng)度比較長(zhǎng),一個(gè)長(zhǎng)度比較小,通過三元運(yùn)算符,長(zhǎng)度小于 0 的時(shí)候,對(duì)應(yīng)的位數(shù)直接賦值為 0。利用雙指針的思想來解決這個(gè)問題。
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; //當(dāng)前的
carry = cur / 10;
len1--;
len2--;
sb.append(cur % 10);
}
if (carry != 0) {
sb.append(carry);
}
return sb.reverse().toString();
}
大數(shù)向乘 模擬兩個(gè)字符串相乘,用一個(gè)數(shù)組來保存臨時(shí)的數(shù)據(jù),最后再?gòu)哪┪查_始處理數(shù)組,數(shù)組長(zhǎng)度等于兩個(gè)字符串長(zhǎng)度之和。
//大數(shù)相乘
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; //剛開始這個(gè)漏掉了 a[i]需要和10進(jìn)行取模
}
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();
}
#字符串相加和相乘-手撕##面試手撕#牛牛的算法專欄 文章被收錄于專欄
牛牛的算法專欄,記錄一些算法題