面经|社招 云知声|一面 已凉
1071
发布于 未知归属地

这次是去现场面试,大概晚上 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;
  }
};

之后就开始看简历,问八股和之前工作上的内容:

  1. 指针和引用的区别,从底层实现机制上讲。

  2. 虚函数和纯虚函数的区别。

  3. 是否有做过工程呢,从工程的角度来看你会如何设计各个类,以及类之间的关系,以让程序结构显示的非常清晰。

  4. 如何解决代码耦合的问题。

  5. TCP/IP 的 4 层参考模型是什么,为什么需要传输层和网络层,它们主要做了什么事情。

  6. 动态库和静态库有什么区别,当可执行程序运行时它是如何链接到对应的动态库,即如何寻址得到动态库在内存中的起始地址(并不是 echo $PATH 查找链接的路径)。

  7. 进程间通信的方式有哪些,你经常使用的是哪种,讲一下它是如何使用的。

  8. 当知道字符串 str 某一个元素的位置,如何修改它的值。

  9. 单例模式具体如何实现,除了单例模式、工厂模式和观察者模式,你还用过什么其他设计模式呢。

  10. http 和 https 的区别,证书有用过吗。

  11. 讲一下在声网的工作经历。

  12. 在生成 release 版本时,你们会将符号信息直接打包到版本中吗?这样体积岂不是很大(因为是运行在服务器上的,所以内存不是瓶颈,面试官之所以会问这个问题是因为它们 App 是跑在嵌入式设备的终端上的)。

  13. 声网用了你们 AI 语音合成,这个主要是做什么的。

最后反问岗位是做什么的,面试官说是做 QT 开发,还有一些服务端的开发、运维和部署的工作,所以其实客户端和服务端的工作都有。其实在他们会议室是两个面试官面试我一个人,最后几个人还混得比较熟了,可能是聊得比较相投,一面应该是过了,之后就是技术经理面试了。

评论 (0)