最近在面试某大厂,跪在了最后一面技术面上。面试官要求带电脑,并在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; }
其实题目本身并不难,说面试时紧张也好,同时平时编码少,说缺乏熟练度也好,总之跪在了最后一面。
非常遗憾,今后仍需要加强编码。