这次是去现场面试,大概晚上 18:30 hr 让我填下表格,然后面试官给了一页纸,上面有三道算法题,难度 Easy,花 10 分钟写下思路,之后面试官再问解题方法:
1.有一个字符串比如 "AB0.x9_d",构造一个新的字符串要求只包含 'a-z'、'A-Z' 和 '0-9',要求时间复杂度为 O(n),空间复杂度为 O(1)。
#include <iostream>
#include <string>
bool check(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
}
int main() {
std::string str;
std::cin >> str;
int i = 0, j = 0, n = str.size();
while (j < n) {
while (i < n && check(str[i])) ++i;
j = i;
while (j < n && !check(str[j])) ++j;
if (j < n) {
str[i++] = str[j];
str[j] = '-';
}
}
str.resize(i);
std::cout << str << std::endl;
return 0;
}2.给定一个 n,打印杨辉三角形,要求平均空间复杂度为 O(n * n / 2),比如 n 为 5:
[1]
[1 1]
[1 2 1]
[1 3 3 1]
[1 4 6 4 1]#include <iostream>
#include <vector>
int main() {
int n;
std::vector<std::vector<int>> v;
std::cin >> n;
v.resize(n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i + 1; ++j) {
if (i == 0 || j == 0 || i == j) {
v[i].push_back(1);
} else {
v[i].push_back(v[i - 1][j - 1] + v[i - 1][j]);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < v[i].size(); ++j) {
std::cout << v[i][j] << ' ';
}
std::cout << std::endl;
}
return 0;
}3.当前有一个结构体 Node,第一个问题 f(Node*& p) 此时 *& 的含义以及为什么要用它,第二个问题是反转整个链表。
Node 定义如下:
struct Node {
int val;
Node* next;
Node() : val(0), next(nullptr) {}
Node(int x) : val(x), next(nullptr) {}
};class Solution {
public:
Node* reverseList(Node* head) {
Node* p = nullptr;
while (head) {
Node* tmp = head->next;
head->next = p;
p = head;
head = tmp;
}
return p;
}
};之后就开始看简历,问八股和之前工作上的内容:
指针和引用的区别,从底层实现机制上讲。
虚函数和纯虚函数的区别。
是否有做过工程呢,从工程的角度来看你会如何设计各个类,以及类之间的关系,以让程序结构显示的非常清晰。
如何解决代码耦合的问题。
TCP/IP 的 4 层参考模型是什么,为什么需要传输层和网络层,它们主要做了什么事情。
动态库和静态库有什么区别,当可执行程序运行时它是如何链接到对应的动态库,即如何寻址得到动态库在内存中的起始地址(并不是 echo $PATH 查找链接的路径)。
进程间通信的方式有哪些,你经常使用的是哪种,讲一下它是如何使用的。
当知道字符串 str 某一个元素的位置,如何修改它的值。
单例模式具体如何实现,除了单例模式、工厂模式和观察者模式,你还用过什么其他设计模式呢。
http 和 https 的区别,证书有用过吗。
讲一下在声网的工作经历。
在生成 release 版本时,你们会将符号信息直接打包到版本中吗?这样体积岂不是很大(因为是运行在服务器上的,所以内存不是瓶颈,面试官之所以会问这个问题是因为它们 App 是跑在嵌入式设备的终端上的)。
声网用了你们 AI 语音合成,这个主要是做什么的。
最后反问岗位是做什么的,面试官说是做 QT 开发,还有一些服务端的开发、运维和部署的工作,所以其实客户端和服务端的工作都有。其实在他们会议室是两个面试官面试我一个人,最后几个人还混得比较熟了,可能是聊得比较相投,一面应该是过了,之后就是技术经理面试了。