返回字符数组之和的结果

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).

aeh*_*aeh 6

你可以使用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)

注意:该函数的前提条件是输入字符数组应仅包含数字.


Com*_* 10 5

最明显的答案是内部使用类似atoisprintf将数字转换为整数,做总和并返回响应作为char*然而,重要的东西在这里没有什么面试官问,但为什么.

根据我的经验,面试官可能不希望你写一个涵盖所有角度的解决方案的哼唱者.他们最想要达到的是最常见的方法是什么,以及这种功能的可能限制是什么.即:

  1. 如果您的输入数字不是整数会发生什么?(例如13.245,2.3E + 7)

  2. 如果您的"数字"根本不是数字,会发生什么?

  3. 如果您的输入整数非常大,会发生什么?(即~2 ^ 31)

  4. 你怎么能发现错误,你会如何报告?

  5. 你会如何为结果字符串分配内存?

  6. 内存分配对调用代码意味着什么?

  7. 该功能的效率如何?如何提高效率?

通过这种方式,面试官希望探讨您对解决问题方法的批评经验.当然,有很多方法可以解决这个问题.一些方法具有副作用,但在某些情况下,这些副作用(即整数溢出)可能不是很重要.

编码通常是一个全面的解决方案和可以快速生成的(因此成本更低)之间的权衡.这些问题使得访谈者能够感受到您对质量的理解 - 也就是说,您能设计出适合目的的东西,强大而且不需要太长时间才能组合在一起 - 以及您必须识别/解决常见错误的经验.