2023年6月26日面试

没有了应届生的身份,在深圳这边找工作切实感受到了竞争的激烈……

昨天在boss直聘上有个HR联系,当时就约了今天的面试。上午看了些“八股”,下午面试的时候完全没有用上,面试看的还是一个人的综合素质,靠的是日积月累,临时抱佛脚也只能够骗骗自己吧。

到公司签到后领了一份笔试卷子,然后就开始做题。正所谓”养兵千日,用兵一时”平时日复一日地刷题,终于算是有了用武之处。有个老哥交过笔试的卷子后,对方告知:笔试没过,没必要再进行下去了。只能够在背地里骂公司让自己白白跑一趟。

长大以后,我只能奔跑;我多害怕,黑暗中跌倒……

第一题:

简单的字符串拆分、组合的题目。本来题目是很简单,但是里面的一些细节自己没有考虑周全,和面试官在这道题目上讨论了一段时间。后来发现自己把自己差点绕迷糊了,多亏面试官及时提醒。关于技术上的问题还是应该多和别人讨论,通过讨论自己才能够发现自己的不足,然后再及时的查漏补缺。

第二题:

287. 寻找重复数

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

当时想到了两种方法:排序和辅助数组

还有一种时间复杂度O(n),空间复杂度O(1)的方法,面试时没想到。

class Solution {
public:
    int findDuplicate(vector& 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 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 都是一个组合(顺序无关)

按照这位作者的思路,我当时是想复杂了。读懂题目真的很关键……


以上就是全部的笔试题目,虽然说做的不尽如人意,但是最后还是获得了面试的资格。

  1. CC、cflag、CXX分别代表什么?
    1. CC:编译C代码的默认编译器
    2. cflag:编译参数
    3. CXX:编译C++代码的默认编译器
  2. 使用fork时应该注意些什么?
    1. 主要是想考察多线程和fork的问题:如果父进程是多线程的,fork后子进程是由父进程调用fork的那个线程的副本构成的,子进程内部只存在一个线程。
  3. socket编程时read函数返回值分别代表什么?
    1. 大于0:成功读取的字节数
    2. 等于0:读取到文件尾
    3. -1:发生错误,通过具体的errno确定具体是什么错误
  4. 线程之间是怎么实现通信的?
    1. 不同的进程具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。统一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其他线程所用。
    2. 全局变量实现线程间通信
  5. websocket和http的区别
    1. WebSocket是一种全双工通信协议,它通过一个TCP连接来连接两个系统。一旦建立了WebSocket连接,任何一方都可以向另一方发起传输,并且指定的服务器应用程序可以维护多个客户端连接,从而支持低开销广播和聊天类型的系统。WebSocket连接是使用HTTP升级头从标准HTTP连接形成的,一旦握手完成,用于连接的协议就从HTTP转换为WebSocket。
    2. WebSocket是从HTML5开始提供的一种新协议,能够在单个TCP连接上进行全双工通信。通过使用WebSocket,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送新的数据。在WebSocket模型中,浏览器和服务器只需要完成一次握手,就可以在浏览器和服务器之间形成一条快速传输数据的通道,两者之间即可直接传达数据。
  6. protobuf是用来做什么的,实现的原理是怎样的?
    1. 跨平台代码生成器
    2. 提供一系列的序列化方法
    3. 优点
      1. 序列化以后体积比JSON和XML格式小,便于网络传输
      2. 支持跨平台、跨语言
      3. 有很好的“向后”兼容性
      4. 序列化和反序列化速度更快,高于JSON的处理速度
  7. 交叉编译
    1. 交叉编译就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统。
    2. 具体使用的时候需要根据不同的平台设置不同的环境变量
  8. 实现一个类似于malloc的函数mymalloc

你可能感兴趣的:(面试,职场和发展)