jos*_*osh 5 c c++ arrays pointers
最近在一次采访中,我被问到一个问题,即编写一个函数,它将两个字符数组(整数)作为输入并返回输出字符数组.
功能签名:
char* find_sum(char* a, char* b)
Run Code Online (Sandbox Code Playgroud)
怎么会接近这个?
示例场景:
find_sum("12345","32142") = "44487"
Run Code Online (Sandbox Code Playgroud)
注意:
位数可以很多(1-100).
你可以使用char数组方法添加大量数字.但是你需要在每次使用它之后删除char*或者使用一些智能指针.
char* find_sum(char* a, char* b) {
int lenA = strlen(a), lenB = strlen(b);
int max = lenA > lenB ? lenA : lenB; // Get the max for allocation
char* res = (char*)malloc (max+2);
memset(res, '0', max +1); // set the result to all zeros
res[max+1] = '\0';
int i=lenA - 1, j = lenB - 1, k = max;
for (; i >= 0 || j >=0; --i, --j, --k) {
int sum = 0;
if (i >= 0 && j>=0)
sum = a[i] - '0' + b[j] - '0' + res[k] - '0' ; // add using carry
else if (j >= 0)
sum = b[j] - '0' + res[k] - '0' ; // add the carry with remaining
else if (i >= 0)
sum = a[i] - '0' + res[k] - '0' ;
res[k] = sum % 10 + '0';
res[k-1] = sum / 10 + '0';
}
return res;
}
int main() {
printf (" sum = %s ", find_sum("12345432409240242342342342234234234", "9934563424242424242423442424234"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:该函数的前提条件是输入字符数组应仅包含数字.
最明显的答案是内部使用类似atoi
和sprintf
将数字转换为整数,做总和并返回响应作为char*
然而,重要的东西在这里没有什么面试官问,但为什么.
根据我的经验,面试官可能不希望你写一个涵盖所有角度的解决方案的哼唱者.他们最想要达到的是最常见的方法是什么,以及这种功能的可能限制是什么.即:
如果您的输入数字不是整数会发生什么?(例如13.245,2.3E + 7)
如果您的"数字"根本不是数字,会发生什么?
如果您的输入整数非常大,会发生什么?(即~2 ^ 31)
你怎么能发现错误,你会如何报告?
你会如何为结果字符串分配内存?
内存分配对调用代码意味着什么?
该功能的效率如何?如何提高效率?
通过这种方式,面试官希望探讨您对解决问题方法的批评经验.当然,有很多方法可以解决这个问题.一些方法具有副作用,但在某些情况下,这些副作用(即整数溢出)可能不是很重要.
编码通常是一个全面的解决方案和可以快速生成的(因此成本更低)之间的权衡.这些问题使得访谈者能够感受到您对质量的理解 - 也就是说,您能设计出适合目的的东西,强大而且不需要太长时间才能组合在一起 - 以及您必须识别/解决常见错误的经验.
归档时间: |
|
查看次数: |
4050 次 |
最近记录: |