leetcode_位元組跳動_挑戰字串_字串相乘
阿新 • • 發佈:2020-07-14
字串相乘
給定兩個以字串形式表示的非負整數num1
和num2
,返回num1
和num2
的乘積,它們的乘積也表示為字串形式。
示例 1:
輸入: num1 = "2", num2 = "3" 輸出: "6"
示例2:
輸入: num1 = "123", num2 = "456" 輸出: "56088"
說明:
num1
和num2
的長度小於110。num1
和num2
只包含數字0-9
。num1
和num2
均不以零開頭,除非是數字 0 本身。- 不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。
一開始看到這個題目,當然首先想到的是小學就學的進位制乘法,那種方法要記錄進位和計算當前位的結果,實現起來比較簡單。
例子:
1 2 3
4 5 6
--------------是不是很熟悉。
和我們的習慣每次計算下面一個位數乘上面的數的時候就做一次加法運算,而不是全部乘起來再做 加法運算。
class Solution { public: string multiply(string num1, string num2) { /*****蠻力法--O(n^2)****/ int len1 = num1.length(); int len2 = num2.length(); if((len1==1&&num1[0]=='0')||(len2==1&&num2[0]=='0')) return "0"; char *res = new char[len1+len2+10]; memset(res,0,sizeof(char)*(len1+len2+10)); int pos=0;//記錄第幾位 int value=0;//記錄進位數 for(int i=len1-1;i>=0;i--){ pos=len1-i-1; value=0;for(int j=len2-1;j>=0;j--){ if(res[pos]>='0') res[pos]-='0';//便於計算 int val = (num1[i]-'0')*(num2[j]-'0');//獲得乘積 int val1 = value+val%10+res[pos];//獲得位上累加數 //cout<<num1[i]<<"--"<<num2[j]<<"---"<<val<<"--"<<val1<<endl; if(val1/10==0){//相加無進位 value = val/10;//獲得進位 res[pos++] = val1+'0';//獲得位上結果 } else{ value = val/10+val1/10;//獲得進位 res[pos++] = val1%10+'0';//獲得位上結果 } } if(value!=0){ if(res[pos]>='0') res[pos]-='0'; res[pos]=value+'0';//最後的進位 } } string str = res; reverse(str.begin(),str.end()); return str; } };
值得記錄的是,在這個題目中將字串陣列化為string型別,一開始遺忘了,查詢後發現可以直接利用string型別的建構函式傳入char陣列做引數或是拷貝構造直接利用複製號實現。
然後利用了algorithm標頭檔案中的reverse函式將string型別翻轉。
字串相乘給定兩個以字串形式表示的非負整數num1
和num2
,返回num1
和num2
的乘積,它們的乘積也表示為字串形式。
示例 1:
輸入: num1 = "2", num2 = "3" 輸出: "6"
示例2:
輸入: num1 = "123", num2 = "456" 輸出: "56088"
說明:
num1
和num2
的長度小於110。num1
和num2
只包含數字0-9
。num1
和num2
均不以零開頭,除非是數字 0 本身。- 不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。