第一题:
简单的字符串拆分、组合的题目。本来题目是很简单,但是里面的一些细节自己没有考虑周全,和面试官在这道题目上讨论了一段时间。后来发现自己把自己差点绕迷糊了,多亏面试官及时提醒。关于技术上的问题还是应该多和别人讨论,通过讨论自己才能够发现自己的不足,然后再及时的查漏补缺。
第二题:
287. 寻找重复数
给定一个包含
n + 1
个整数的数组nums
,其数字都在[1, n]
范围内(包括1
和n
),可知至少存在一个重复的整数。假设
nums
只有 一个重复的整数 ,返回 这个重复的数 。
当时想到了两种方法:排序和辅助数组
还有一种时间复杂度O(n),空间复杂度O(1)的方法,面试时没想到。
class Solution {
public:int findDuplicate(vector<int>& nums) {int num = nums[0];int index = 0;while (num != index) {index = num;num = nums[index];nums[index] = index;}return num;}
};
一看就会,一写就废~
第三题:
寻找第一个比n小的素数。
当时是用枚举的方法来写的,当时又想到使用素数打表,但是具体打表的方法并不是太熟悉,只写了一个大概的思路。
Code:
class Solution {
public:int countPrimes(int n) {vector<int> isPrimes(n+1, 1);for (int i = 2; i * i < n; ++i) {for (int j = i * i; j < n; j += i) {isPrimes[j] = 0;}}int count = 0;for (int i = 2; i < n; ++i) {if (isPrimes[i] == 1) count++;}return count;}
};
从上面的代码中可以看出,采用素数打表的方法会开一个额外的辅助数组,时间复杂度也不比枚举更高效。
第四题:
约瑟夫环问题
当时是用循环链表的方法来求解的,更高效的方法是采用数学公式推导。
借用该网友的一句话:本质上就是n-1问题与n问题之间下标的转换,当n=1时,下标自然是0.
class Solution {
public:int lastRemaining(int n, int m) {if (n == 0) return 1;return (lastRemaining(n-1, m) + m) % n;}
};
第五题:
有26个字母a~z,找出所有字母组合,a、b、c、ab、abc、a~z 都是一个组合(顺序无关)
按照这位作者的思路,我当时是想复杂了。读懂题目真的很关键……
以上就是全部的笔试题目,虽然说做的不尽如人意,但是最后还是获得了面试的资格。
- CC、cflag、CXX分别代表什么?
- CC:编译C代码的默认编译器
- cflag:编译参数
- CXX:编译C++代码的默认编译器
- 使用fork时应该注意些什么?
- 主要是想考察多线程和fork的问题:如果父进程是多线程的,fork后子进程是由父进程调用fork的那个线程的副本构成的,子进程内部只存在一个线程。
- socket编程时read函数返回值分别代表什么?
- 大于0:成功读取的字节数
- 等于0:读取到文件尾
- -1:发生错误,通过具体的errno确定具体是什么错误
- 线程之间是怎么实现通信的?
- 不同的进程具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。统一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用。
- 全局变量实现线程间通信
- websocket和http的区别
- WebSocket是一种全双工通信协议,它通过一个TCP连接来连接两个系统。一旦建立了WebSocket连接,任何一方都可以向另一方发起传输,并且指定的服务器应用程序可以维护多个客户端连接,从而支持低开销广播和聊天类型的系统。WebSocket连接是使用HTTP升级头从标准HTTP连接形成的,一旦握手完成,用于连接的协议就从HTTP转换为WebSocket。
- WebSocket是从HTML5开始提供的一种新协议,能够在单个TCP连接上进行全双工通信。通过使用WebSocket,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送新的数据。在WebSocket模型中,浏览器和服务器只需要完成一次握手,就可以在浏览器和服务器之间形成一条快速传输数据的通道,两者之间即可直接传达数据。
- protobuf是用来做什么的,实现的原理是怎样的?
- 跨平台代码生成器
- 提供一系列的序列化方法
- 优点
- 序列化以后体积比JSON和XML格式小,便于网络传输
- 支持跨平台、跨语言
- 有很好的“向后”兼容性
- 序列化和反序列化速度更快,高于JSON的处理速度
- 交叉编译
- 交叉编译就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统。
- 具体使用的时候需要根据不同的平台设置不同的环境变量
- 实现一个类似于malloc的函数mymalloc