最近在面試某大廠,跪在了最后一面技術面上。面試官要求帶電腦,並在40分鍾內當場完成一道題並要求跑通。
題目是兩個數字字符串相乘,得出的結果也用字符串輸出。例如給string a = "123", string b = "456",求出結果字符串。
回來仔細思考了一下,並在1小時內完成了這道題。
思路如下:
要計算123 * 456,可以模擬我們自己在進行乘法運算的過程,先計算6 * 123 = 738, 再計算5*123 = 615, 再計算4*123 = 492。
最后再對三個字符串做移位相加。移位就是在后面補零。如果字符串還不相等,就在前面補0,知道兩個字符串長度相等,再進行相加操作。
代碼如下:
#include<iostream> #include<string> using namespace std; //單個字符與字符串相乘的結果 string multiply(string a, char b) { int len = a.size(); int i0 = 0, i1 = 0; int current; int temp = 0; string res; for(int i=len-1;i>=0;i--) { current = (a[i] - '0')*(b-'0') + temp; i0 = current%10; //個位 i1 = current/10; //十位 res = char(i0 + '0') + res; temp = i1; } if(i1!=0) res = char(i1 + '0') + res; return res; } //兩個字符串錯位相加 string add(string a, string b, int b_shift) { string res; if(a.size() == 0) return b; for(int i=0;i<b_shift;i++) b = b + '0'; int len_a = a.size(); int len_b = b.size(); int diff = len_a - len_b; if(diff>0) { for(int i=0;i<diff;i++) b = '0' + b; } else if(diff<0) { for(int i=0;i<abs(diff);i++) { a = '0' + a; } } int len = a.size(); int current; int temp = 0; int i0 = 0, i1 = 1; for(int i=len-1;i>=0;i--) { current = a[i] - '0' + b[i] - '0' + temp; i0 = current%10; i1 = current/10; res = char(i0 + '0') + res; temp = i1; } if(i1>0) res = char(i1 + '0') + res; return res; } //兩個字符串相乘 string multiply(string a, string b) { int len_a = a.size(); int len_b = b.size(); string current; string res; for(int i=b.size()-1;i>=0;i--) { current = multiply(a, b[i]); res = add(res, current, b.size() - i -1); } return res; } int main() { string a = "98376"; string b = "51209"; string res = multiply(a, b); cout<<res<<endl; }
其實題目本身並不難,說面試時緊張也好,同時平時編碼少,說缺乏熟練度也好,總之跪在了最后一面。
非常遺憾,今后仍需要加強編碼。