阿里C++岗位电话面试

阿里C++岗位电话面试


周四的时候一位HR(疑似hr,阿里人都用花名)发来短信讲看到我的简历,询问是否有阿里C++岗位的意愿。如果有可以回复下,先进行电话面试聊一下。于是短信回复可以看一下,并约了周六晚上。

接通电话才发现原来是个妹子,聊了下现在的工作,以及为什么想换工作,妹子表明本次只先做个写代码评估(我内心一阵白眼)。钉钉甩给我一个连接,是一个多人在线都能看到的界面,也就是我写代码她能看到。

妹子还特别表示有些人做的快,有些人可能慢一点,咱们不用急,做多少是多少。
于是开始放了第一道题

1、数字的各位相加求和,直到结果为一位数。比如 38 3+8=11 1+1=2 结果输出2

int addNum(int num) {
    int sum = 0;
    while (num) {
        sum += num % 10;
        num = num / 10;
    }
    return (sum <= 9) ? sum : addNum(sum);
}

2、输出字符串中第一个只出现一次的字符 比如 “abacbacde” 输出d

char firstchar(char* str) {
    map m_count;
    char* p1 = str;
    while (p1 != NULL && *p1 != '\0') {
        m_count[*p1]++;
        p1++;
    }
    char* p2 = str;
    while (p2 != NULL && *p2 != '\0') {
        if (m_count[*p2] == 1)
            return *p2;
        else
            p2++;
    }
    return -1;
}

这道应该是剑指offer上的题目,我很久以前做过,稍微有点印象。这里使用了一个map,第一次遍历存下了每个数字出现的次数。第二次遍历判断出现一次的value就可以直接返回了。写的时候想到这里可以使用一个queue存下字符出现的顺序,遍历每个不同的字符就可以了,可以减少重复字符的判断。不过会使用更多的空间(queue),就没去写。

3、两个字符串(长度<5000)相加,不能使用任何大整数运算库。 比如 “3”+“564”=“567”

inline int charNum2int(char num) {
    return num - '0';
}
inline char int2charNum(int num) {
    return num + '0';
}

string addString(string num1, string num2) {
    string result;
    int cur = 0;
    int car = 0;
    int sum = 0;
    int i = num1.size()-1;
    int j = num2.size()-1;
    while (i >= 0 || j >= 0) {
        if (i < 0)
            sum = charNum2int(num2[j]) + car;
        else if (j < 0)
            sum = charNum2int(num1[i]) + car;
        else
            sum = charNum2int(num1[i]) + charNum2int(num2[j]) + car;
        cur = sum % 10;
        car = sum / 10;
        result = int2charNum(cur) + result;
        i--;
        j--;
    }
    
    return result;
}

这个题初看的时候觉得很简单,准备直接字符串转化数字,数字相加再转回来就ok了。写到一半突然看到有5000个字符。这肯定没有什么数字类型能存下了啊,思路被打乱,略慌了一下。既然不能加,那咱一个一个加总ok了吧。
写的时候有点慌张,整体来说思路是对的,却有3个地方都写错了。
1.while (i-- >= 0 && j-- >= 0) 循环条件"-1"放在了开头。导致最后的字符不能被算到。
2.本来考虑的是其中一个字符串算完了,另一个字符串直接拼接。所以最后加上了两个判断。实际substr切割字符串同样是循环,多此一举了。并且没有计算到最后一次的进位。比如 “12945”+“78”

    if (i >= 0) {
        result += num1.substr(0, i+1);
    }
    if (j >= 0) {
        result += num2.substr(0, j+1);
    }

3.由于我是从后往前计算的,第一个计算出的结果应该是最后一位。应该使用 result = int2charNum(cur) + result。
我用成了result += int2charNum(cur)。

总的来说,这次笔试差不多半个小时写了三道还比较简单的题。第三道写的时候思路比较乱,导致几个问题都没考虑到。还是我自己对写算法题很不熟练,平时勤刷题还是很有必要的,基础知识要牢固。

你可能感兴趣的:(面试经历)