作者:从0开始学c
链接:https://www.nowcoder.com/discuss/128236
来源:牛客网

然后问算法,问了反转链表,要求空间复杂度o1,我在循环内用了一个局部指针变量,虽然不优雅,但是局部变量每次循环完都会被析构,他硬说我的空间复杂度是on。

然后问了虚函数,这是唯一问的c++,我感觉他也就会个虚函数了。

然后问找前k大的数。

我: 如果内存放得下的话,用类似快排的思想,partition把大的放左边,小的放右边,调用partition之后,如果分界元素等于k,则返回最左边的k个值;否则对k所在的半边递归调用parition,平均时间复杂度是on。

面试官(惊讶): 时间复杂度是on?

我: 是啊

面试官: 真的是么?

我: 是啊,假如每次分界完,平均下次要处理的元素占总元素数的a/b,那么时间近似是(1+a/b+(a/b)^2+…)n= b/a*n

面试官: 那我的k要是很大,接近n,你这个不就是n平方了么

我: a/b是平均下次要处理的元素占本次处理的总元素的比值,跟k无关

面试官: 那最坏时间复杂度是多少

我: on^2 当数组已经有序,每次处理完规模减少1。 如果你觉得这个方法不好,在内存放得下的情况下,那我们用堆做,建一个最大堆,建堆的时间复杂度是on,调整k次,调整一次的时间复杂度是ologn,一共是o(n+klogn)

面试官: 建堆的时间复杂度是on?

我: 有什么疑问么

面试官: 你确定?

我: 确定!

面试官: 你再想想?

我: 建堆是从最后一个非叶结点开始调整,倒数第二层最多有n/2个需要调整的元素,最多需要调整1次,倒数第三层最多有n/4个需要调整的元素,每个最多需要调整2次,以此类推,最后累加起来接近线性时间复杂度。

面试官: 额…

我: 换一种方法,如果数据比较大,内存放不下,可以用优先队列,实现也是堆。优先队列是用一个最大堆,我们求前k大要用最小堆,所以要重载小于号运算符,优先队列重载时候要指定底层容器,我一般指定的是vector。执行时候如果队列里面的元素少于k个,则直接插入;否则将该元素与top()比较,如果大则删掉top把这个元素放到队列中。

面试官:额..

我: 如果重复元素算一个,就用set,set是默认从小到大排列的,所以不需要重载运算符。

然后面试官没有回话,思考了一会,用“你会数据库么”结束了对算法的问询。在得知我不会数据库之后,面试官开始了他的主导,一直问数据库。我说,我不会数据库,要不你问问别的吧。然后他问我会网络么,我说曾经会一些,很久没用了,于是就问我tcp连接的终止,在我答完四次握手之后,问我服务器单方面终止链接之后,客户端继续发送数据会怎么样; 双方都终止了之后,客户端继续向服务器发送数据会怎么样。
如何处理get和post
tcp接收窗口和拥塞窗口
什么时候会向对端传窗口大小
extern C的意义
假设rtt(数据从两端一来一回) 100ms,那么从输入一个http://url到得到网页要多少时间
https呢?
连续发送两次http请求,会得到两次结果吗?可能第二次比第一次快吗?
是否了解TCP包头阻塞?
服务器状态502 503 504什么问题,怎么排查
netstat具体查看什么问题
写题:多路归并(用了堆,在细节上有一些问题)
看代码中的问题:
class Foo
{
public:
Foo(){_p = new int();}
~Foo() {delete _p; _p = nullptr;}
private:
int* _p;
}
sql:三句查询,要求建立索引来优化查询
一些linux语句的作用:less more sed awk du df dd at tee crotab xargs
最近看了什么技术书籍

二面
linuxIO模型,区别在哪
线程独立拥有哪些资源
协程和线程有什么差别,优势呢?
get和post有什么差别
sendfile的优势在哪?
代码:随机播放100首歌(洗牌算法/这个我把自己绕进去了,洗一次直接输出就完了,我当时脑子短路了,洗一次播一首非要再洗一次来手动提升复杂度,最后没绕出去,然后换题了)
两个倒序数组找最第k大的(框架差不多,最后发现漏了一种情况,感觉还在想洗牌的事情)

因为二面代码花了很久,最后没写完,当时心态有点崩,但给了三面

三面
三面没有写代码,问了一个小时,面试官全程半启发半追问,感觉有点懵,我把上下文相关的问题空格分段了

C/C++内存问题有哪些,尽量说
free和delete在具体实现上的差异
free之后的指针使用有什么问题
缓冲区溢出如何避免,有哪些场景
如何检查/处理越界
野指针和悬空指针分别是什么
试图使用野指针有什么问题
内存上还有别的问题吗?

C++11用过什么特性

之前讲的内存问题有什么好的方法吗?
智能指针讲一下
shared_ptr讲一下,怎么实现的,unique_ptr呢?
是不是所有要用指针的地方都应该用智能指针,有什么问题和不足?(我答了两次寻址和额外空间)
这些缺陷,在不用shared_ptr的前提下有减少成本的策略吗?(跳过了)

include,头文件里面一般放了些什么
声明和实现要写在一起吗?是不是一定要分开写?
写在一起和分开对最后的代码有什么影响,怎么确认(这个我不会,面试官让我试着分析一下,结合include的行为来谈)
gdb怎么查看一个函数的地址?
你在Linux使用经常哪些指令
如何探查CPU负载情况
在什么时候CPU被认为是繁忙/空闲的?

看过哪些比较大的代码?(后面很多问题是从这来的)

服务器:
多线程服务器和nginx在工作方式有什么不一样的地方
nginx怎么处理请求
进程唤醒(惊群问题)的额外成本主要在哪?
nginx的负载均衡(我只答了那个worker的负载均衡)
为什么它要用多进程,优势在哪,劣势在哪
多线程怎么应付同样的问题,能够解决吗,讲一讲方案
你的方案有什么问题?

http了解多少?
http缓存机制了解吗?
长连接讲一下
如何实现长连接(保活)
带外数据如何使用?
你的这个方法有什么问题,可以直接兼容不同的浏览器吗?
了解nginx的解决方案吗?

redis
你对redis怎么理解的?
redis的总体结构
单线程的优势和缺点
redis的事件分发
讲一讲文件事件有哪些
client功能是怎么实现的
时间事件(serverCron函数)
serverCron做了什么
redis所有事情都只有一个单线程吗?
bgsave讲一下,为什么要fork一个进程来做

interrupt与signal有什么差别
interrupt的发起和接受者是谁
操作系统在interrupt中发挥了什么作用
signal呢,发起者又是谁,接收者呢?(这里答得有点混乱)

TCP
ack什么时候发送,丢失了会怎么样?
sack了解吗?
重传ack的时机只有ack超时吗?
重复报文被接收会发生什么?
拥塞窗口要不要把自己的大小发给接收方,意义何在?(这个问题一面也问了,没有答出来)
延迟ACK的意义在哪?
为什么不能每次都直接发大的窗口?

进程地址空间布局讲一下
BSS为什么要叫这个名字?(后来查了,block started by symbol)
static关键字有什么作用,如果用来修饰函数呢?
多个线程使用static数据会开启多个副本吗?

C++OO
多重继承怎么实现
虚拟继承怎么实现
对于函数寻址在时间成本上有什么差异?
对于继承体系很复杂的情况这个成本会被拉高吗?

 

算法:
1. 两个相交的单链表,找出交点
2. 给一棵树,找出路径和为n的路径
基础:
1. static关键字
2. 在一个函数内定义一个static对象,什么时候构造和析构。如果这个函数从没被调用,会怎么被析构
3. tcp连接和断开
4. 服务器大量close_wait状态,可能是什么原因,怎么解决
一面还有很多问题的,忘了。。。
一面感觉:那个两个相加的单链表的算法,我提出的算法他没见过,然后我证明,然后balabala说的不好,然后跳了。。。
这也是一面唯一一个感觉面的不好的地方
二面:
1. 设计LRU cache,查找复杂的O(1), 过期淘汰
数据库:
2. 联合索引, 最左匹配
3. 假如有联合索引<a,b>,查询where a=xx and c == yy,会用到联合索引么 为什么
4. 如果数据库主键是单调严格递增的,有一个图片,通过url带上id访问,然后查询数据库,会有什么影响
5. 上面那个问题,引出一个情景题,如何设计一个序列生成器,能够单调递增,但是不是严格递增的 ?保存在内存中,宕机怎么办?多个进程怎么办?
这个问题和面试官聊了很久,因为我在微信这边不久前看到过序列生成器
6. 解决并发情况下,使序列生成器生成的id唯一。还有就是在分布式系统,多机服务器怎么办?
7.
long multiply(int m,int n) {
long score;
score = m * n;
return score;
}
这段代码会有什么问题? 然后就说了一下m*n溢出
8.
请问下面的程序一共输出多少个 “-”?,执行一次下面的程序,总共生成了多少个进程?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int i;
for(i=0; i<2; i ) {
fork();
write(1, “-“, 1);
}
wait(NULL);
wait(NULL);
return 0;
}
我说了6次,然后解释了一遍
9. 然后说把write换成printf会多少个’-‘, 我算了一下,说8次,原因是printf是有缓存的
10. c语言程序的内存模型
11. 聊redis , 如果内存已经很多键了,会怎么样?然后说了一下cow 还有balabala
还有一些小问题完了
二面总结:最后的redis因为时间不够,然后面试官说结束了。感觉二面面的挺好的,和面试官聊的也很多
三面:
三面一看就是大佬,他一直在看我的简历,开始那7分钟,大家一句话都没说,很尴尬
1. 写sql
Sid:学号
Cid:课程编号
score:成绩
查询平均成绩大于 60 分的同学的学号和平均成绩
2.
void pass(){
}
int main( ) {
int x;
x = 123;
printf(“%d \n”,x);
pass();
printf(“%d \n”,x);
return 0;
}
// 123
// 456
他问在pass里面添加代码,使输出123和456
因为都在栈里面,有返回地址,占四个字节
void pass(){
int y;
int *addr = &y;
addr 加加  ;
addr加加   ;
*addr = 456;
}
大概思路是这样, 细节有待斟酌
算法题:
3.
随机数生成器:
float rand(); [0,1)
int rand5();
int rand7();
这个通过rand,然后写出rand5,最后写出rand7。面试官刚开始说rand返回[0,1),然后让我写代码验证,
我心里一凉,是不是写错了。果然跑的结果不对,然后现场debug,rand返回的是一个unsigned int,根本不是[0,1),
然后改好了
4. 写一个函数,N 个数字,找到其中第 K 大的数,要求平均时间复杂度尽量低。
我写出来后他让我算时间复杂度,时间复杂度一直没算对,还用了主定理。 作为一个理科生,最后时间复杂度要数列求和,没求出来,很惭愧
5.http状态码
tcp的连接,怎么用udp模拟tcp
数据库索引了解吗(b 树)
那为什么用b 树,有什么优点呢

多态,虚表虚指针,虚基类以及内存分布

函数重载
构造函数和复制构造函数能否为虚,为什么
一个对象的内存分布,多个虚函数占多大空间
shared_ptr介绍原理,weak_ptr如何解决引用传递
右值引用
编译器如何处理模版
编译中的导出符号表和未决符号表
反汇编时符号表的状态
比较c++和java
介绍一下stl的list,查找list复杂度
unorder_map插入复杂度
stl迭代器重载
遍历vector的几种写法
数据库常用数据结构,b+树的好处
图的bfs和dfs
快排,复杂度,最坏情况以及设计算法解决
tcp和udp
如何用udp封装实现tcp
进程和线程
如何保证线程安全
互斥锁原理和使用

1、inline的用法?

2、class A

{

int a;

short b;

int c;

}

sizeof(A)的大小?类中加上double d;呢?

3、你知道什么排序算法?它们的平均复杂度各是多少?其中稳定的排序有哪些?

4、说一下快排。它的最坏复杂度是多少?什么情况下最坏?

5、说一下归并?

6、哈希是什么?哈希如何存储数据?什么情况下用到哈希?

7、说一下static的作用?

8、虚函数你知道吗?它是如何实现的?

9、如何让一个类被有限次数的实例化?

10、纯虚函数是什么?如何定义?

11、一个类如何被称为抽象类?抽象类可以实例化吗?为什么?

12、如何比较两个对象?

13、跳台阶,一次跳1阶或2阶,n阶有多少种跳法?(最多能跳n阶呢?)(动态规划,递归)

14、一个链表,实现它的翻转。(当时定义了三个指针, = =反正挺简单的)

15、有一个数组,所有数据都可以是负数、0、正数,求和最大的连续序列。如果是一个矩阵呢?(矩阵的没答上)

16、stl库懂吗?你常用的有什么?

17、vector的底层是什么?它是如何实现动态分配空间的?如果将其中一个元素删除,那么它的地址空间是怎么样的?

18、map、set知道吗?(知道,底层红黑树。既然你说到红黑树,那说一下红黑树是什么?它的实质是什么?如何实现的?)说一下它们的区别?

19、线程和进程的区别?线程间如何通信?线程共享的资源有什么?

20、TCP和UDP的区别?TCP如何实现可靠传输?它们的传输方式?

21、socket懂吗?如何实现?

22、堆和栈的区别?
二面(可能有一些在上面,具体也记不清了):

23、给你一串字符串,压缩它有几种方法?

24、vector赋值n个数,它需要拷贝几次?

25、基类A,派生类B继承于A,A *a = new B[10]是否正确?会发生什么错误?a[5]能正确的取到对象吗?

26、两个链表,判断他们是否有相交部分?如果他们相交部分有环呢?

27、一副扑克,如何等概率洗牌?不消耗额外空间呢?

一面:
似乎是个不太厉害的面试官,只会问一些套路问题,一开始在纸上写好了一堆考察C++的笔试题,然后让你现场答。
有点印象的记得问了一些指向函数指针的数组怎么写?
char a[] = “test” char b[] = “test”
char *p = “test” char *t = “test”
a==b ?
p==t ?
然后基本一直考察算法:
二叉树非递归中序遍历。
讲一下因为保密协议不能说的笔试题(我觉得巨简单,然而一面面试官似乎并不能轻松看懂我的代码,现在回想起来感觉对网易的技术印象有点降低了)
一个ip地址段(由首地址ip和尾地址ip组成,保证连续)表,怎么找到一个ip属于其中哪一个地址段? (因为ip段不重合,根据首地址排序后二分找就可以了,感觉这题有点迷之简单。)
然后面试官就问ip段重合怎么办?然后当时没想出来,问题转化成查询覆盖一个点的所有线段。
二面:
这次还是有点分量的面试官。
一边充当hr一边充当面试官。
一致性哈希。
手撕智能指针。
给一个情景题,设想产生很多要求保序的请求从多个机器上发到一个多线程的代理上,再由代理调用分布式的数据库,怎么保证这个过程中的顺序不乱。
然后开始继续怼算法:
求一个数组左边之和最接近右边之和的节点。我想的是用前缀和来搞。
求中位数。
求一个流动数组的中位数,每次加入元素都要返回中位数,两个堆解决。

1,c++多态的实现。讲了c++虚函数表,单继承,多继承,虚继承以及为什么虚继承,调用过程
2,智能指针。
3,熟悉stl的什么结构。我说的是看过sgi 的stl源码。就问了什么情况用vector什么情况用list,
以及vector的insert,erase,remove的实现还有重新申请内存的情况

1.Base类有test方法,Base的不同对象调用test方法,内部是怎样的呢?(我答的指向同一个预先分配好的地方)

2.有一个AnotherBase类(与Base无关系)里面也有一个test方法,用其强制转换Base的对象,再调用这个对象的test方法,请问调用的是哪个类的方法?
3.在方法func()后面加const意味着什么?
4.给一个六面骰子,如何做出一个1~10的等概率随机方法?
5.用过什么设计模式?

  • C 和 C++ 的区别
  • new 和 malloc的区别
  • 对虚函数的理解
  • 多线程的理解(多线程同步的途径)
  • 多进程(继承什么, 不继承什么)
  • 进程间通信
  • gdb的使用, 编译器的使用
  • MySQL 查询前 100 条数据, 以及如何分组
  • 常见的Linux的命令
  • TCP和UDP的区别
  • socket的流程
  • 五种IO模型
  • linux基本操作
    • 拷贝文件 、查看ip、vim的基本操作(查找字符串、替换字符串)、gdb的调试;
    • 查看硬盘大小等等操作
    • 总结需要详细的看看linux的基本操作命令等(这部分很尴尬都不会)
  • STL
    • vector与list的区别
      • 怎么查找倒数第二位数字;
      • 二者的区别;
    • map怎么插入数据 有几种方式
      • 每种方式的优缺点;
  • 多线程多进程
    • 线程间同步的方式 :我答了 信号量、互斥量;问我还有没有 我说我记得就这几个了
    • 然后问我进程间同步的方式 答了一个临界区 ;忘了信号量和互斥量和事件了;
    • 然后我自己抢答了 进程间通信的方式:说了之后然后问我几个问题
      • 怎么创建管道 pipe()
      • 怎么创建共享内存shmget();
        1.自我介绍
        2.用过linux系统吗,哪种linux系统,版本呢?
        3.linux基本命令。怎么查看IP;怎么给文件改名;怎么查看文件的权限;修改权限;怎么加执行权限;怎么查看当前系统的版本;怎么查看当前系统硬盘空间的总量与使用情况;怎么查看系统内存多少;怎么查看某个命令执行的时候需要链接哪些系统库;怎么给一个文件做一个软链接;说一下gdb;怎么把一个test.cpp编译成一个test.so;
        4.vector与list的区别
        5.怎么找某vector或者list的倒数第二个元素
        6.说一下map和set的区别
        7.红黑树的原理
        8.map怎么插入数据,有几种方式
        9.c++11在原来的版本上都加了哪些东西。
        10.智能指针,三种指针都介绍一下其特性,作用。
        11.进程怎么同步,线程怎么同步,要说全。
        12.tcp与udp的区别,udp怎么实现多对多通信,问的很细,包括tcp的各种机制。
        13.说一下快排
        14.QT的信号槽是什么原理。

        C++基础

        • 自我介绍
        • 平时有用C++写过项目吗?(这里没让我展开说项目)
        • 对C++的特性有什么了解
        • 对封装、继承、多态的具体理解
        • public/protected/private的区别
        • 说一下三种方式继承对基类的访问权限
        • 说说构造函数的执行顺序,析构函数呢
        • 说一下构造函数内部干了什么
        • 如何实现多态
        • 构造函数和析构函数可以调用虚函数吗,为什么
        • 析构函数一定要是虚函数吗,为什么
        • 怎么理解C++的面向对象和C的面向过程
        • 可以介绍一下new的实现原理吗
        • new和malloc的异同处
        • C++怎么为各种变量分配内存空间的
        • 引用了解吧,介绍一下
        • 拷贝构造函数内部做了什么,什么时候需要重写
        • 初始化列表了解吗(以为是那个C11特性,没敢说)
        • 平时用什么编程环境(Windows+MFC+Qt)
        • 用过Qt是吧,说一下信号和槽的机制,绑定的方式
        • 你觉得MFC和QT比各自有什么优缺点
        • MFC的消息机制和Qt消息机制的对比

        进程线程相关

        • 了解过线程吗,谈一下进程和线程的联系和区别吧
        • 对于共享的区域多个进程或线程一起访问会不会出问题,要怎么解决(同步和互斥)
        • 进程通信有哪几种方式,介绍一下

        网络(项目里有)

        • Socket的流程是什么样的(服务端和客户端两个)
        • 项目里用的什么协议(TCP)
        • TCP和UDP的区别,优缺点

        数据库

        • 你这项目的数据库自己设计的吗,简单介绍一下你的设计流程
        • 了解数据库范式吗,介绍一下
        • 用过索引是吧,说一下索引的优缺点,选取条件
        • 数据库里多对多关系怎么处理设计

        数据结构

        • 说说vector和list的不同,优缺点
        • 平衡二叉树了解吗,说说它的特点,时间复杂度(logN)
        • 说说二叉树的三种遍历(想让我写来着,没带纸笔,口述了算法思想和区别,递归和非递归)
        • 图了解吗,说一说它的遍历(广度和深度)

        回到C++

        • 说说宏定义和const的区别
        • 宏定义和内联函数的区别
        • 内联函数的作用,和普通函数有什么区别
        • C++有几种转换方法,简单介绍一下
        • 重载是什么,和重写有什么区别

1.自我介绍
2.讲一下C new和malloc的区别

3.malloc内存分配机制是怎么样的,在哪里分配内存,最大可以申请多大的内存(三连击?)

4.讲一下new运算符的原理(底层使用了operator new(),最终调用了malloc),new运算符重载用过吗,怎么写重载函数,重载的定义

5.memset函数的作用,有哪些参数

6.linux系统应用程序的内存空间是怎么分配的(内核空间和进程空间),一般进程空间多大,内核空间多大,进程空间分布是什么样的,堆区最大空间是多少

7.c   模板机制了解吗,讲一下原理,类模板和函数模板在定义时有什么区别

8.开始问数据结构,你了解二叉树吗,讲一下原理,平衡二叉树的原理讲一下,二叉树的遍历方式,二叉树的最大节点数,二叉树插入删除的时间复杂度,二叉树插入的时间复杂度与树的节点数和树深度的关系,二叉树的优点(二叉树这部分问了10几分钟?)

9.数组和链表的区别讲一下,它们的应用场景

10.c 继承机制讲一下,虚继承了解吗,说一下原理

11.虚函数机制,一个类有虚函数,有成员变量,求所占的内存大小(这里一开始我没有考虑内存对齐,就直接按虚指针和成员变量的大小说,后面面试官提醒了一下才改过来)

12.看到简历上写了网络编程这块,就问了一下tcp和udp的区别,它们的应用场景(面试官拿王者荣耀来举例子,问像王者荣耀这样的游戏,服务器与客户端通信应该用什么机制),怎么实现服务器高并发,多连接

13. socket编程,问了connect函数和accept函数的作用和参数,epoll的原理大概讲一下

一面:
自我介绍,项目介绍,
项目职责,
linux基本命令,
嵌入式开发,
多态的实现,
容器介绍,
数据结构,
手写代码,使用指针逆转字符串
对技术支持的理解,
指针和引用的区别,
指针与数组的区别,
static,
sizeof和strlen区别,
对出差的理解,
工作地点等等,
有什么想问的。

二面:
自我介绍,
项目介绍,
多态在项目中的作用,
static,
手写代码,使用指针在字符串A中查找B

 

 

2.C++11新特性有哪些?
3.智能指针怎么用?智能指针出现循环引用怎么解决?
4.avl树和红黑树区别?
5.三种多路复用io的区别?
6.MySQL数据库的事务ACID,隔离级别?
7.多进程和多线程同步机制?
8.TCP拥塞控制?
9.会哪些设计模式?工厂模式和简单工厂方法有什么区别?
10.手写代码:文本中查找给定的单词,返回单词出现的次数。
二面:
1.项目中用到了哪些技术?
2.TCP可靠性怎么保证的?TCP的滑动窗口影响了什么性能?TCP的粘包怎么解决?TCP为什么要有time_wait状态?
3.智能指针怎么用?
4.static的作用?
5.inline的作用?
6.C++空类有哪些成员函数?参考effective C++,一共四个。
7.进程间通信方式?
8.A,B两个进程如何实现只有一个进程运行,另一个进程退出?
9.两个线程,一个线程打印A,一个线程打印B,如何实现两个线程按顺序打印出ABABAB…?
面试官:手写定义一个空类。
我:默认构造函数,拷贝构造函数,赋值运算符,析构函数(手写。。赋值运算符忘了写返回值,尴尬。。)
面试官:还有吗?
我:没了
面试官:拷贝构造函数的参数(const A&),const可以省略吗?
我:最好不要省略吧,毕竟只是拷贝,不用改动。。
面试官:你见过哪种情况省略的?提示你,标准库里面的,。
我:。。。。。
面试官:&可以省略吗?
我:不可以,因为会不断调用拷贝构造函数巴拉巴拉。。。。。
面试官:A a;A  b = a; A c,c = a;分别调用什么函数?
我:默认构造函数,拷贝构造函数,赋值符。。
面试官:A *p = new A 和 A a;有啥区别?
我:(刚开始没反应过来,说了一个是指针一个是直接声明一个对象,后来小哥提醒后)第一个在堆开辟内存,一个在栈上。new的话先开辟空间后调用构造函数。
面试官:p在哪?
我:栈,然后指向堆上的一块内存。
面试官:说说堆和栈吧。。
我:堆手动,栈自动吧啦吧啦吧啦。。。。
面试官:那你画一下堆和栈在内存中的样子?
我:(方)我只知道堆朝着地址增长的方向生长,栈朝着地址减小的方向增长,不怎么会画。。。。
面试官:栈上为什么是系统自动进行内存分配和释放呢??
我:(方)。。。。。(后来想想是不是想让我说栈的地址存在寄存器中,各种压栈出栈指令都是机器指令???)
面试官:一个源程序到可执行文件的过程:
我:预处理,编译,优化,汇编,连接,
面试官:预处理做些什么
我:三种吧啦吧啦吧啦。。。。
面试官:预处理头文件的时候做了些什么事?
我:(回答比较模糊,就说了把头文件包含进代码中。。。)
面试官:编译生成什么?
我:.s文件(尴尬,没说汇编代码)
面试官:链接做了什么?
我:(又是一顿模糊回答)。
剩下的都是网络的问题,我直说还没复习网络,小哥让画了网络模型,然后举例应用层协议。tcp与udp区别,拥塞控制,浏览器中输入网址发生了什么?基本只答出了皮毛。
最后,小哥让写了简答的一个代码,统计一个句子中有哪些不同的单词。刚开始用了map<string,int>,后来小哥让优化,说不用统计次数的,我说直接set好了。
一面:
语言基础:
1.delete是如何知道要释放的内存的大小的。
2.try和catch用的多吗?
3.说以一下STL。
blabla……各自的扩容方式说一下(就讲了讲vector和hash_map的)
4.c++11了解多少。
blabla……大概说了6-7条吧。然后又问到atomic。
网络部分:
1.粘包如何解决?
2.针对TCP三次握手的缺点可能有什么危害?
blabla……我说了SYN攻击,半连接队列…
Linux:
1.编译器除了gcc,g++还了解什么?
2.编译选项常用的说说。
3.coredump用过没?
4.gbd如何解决多线程死锁问题。(不会)
项目简单介绍一下。
你还有什么比较擅长的讲一些。
一面问了很多多线程的知识,这方面有待加强。

1、先做个自我介绍
2、你本科参加过那些比赛印象最深的是哪一个,担任的角色,做了哪些工作
3、看你简历上项目就写了现在的毕设,你做过其他的项目吗?
4、说说对c++面向对象的理解?封装继承多态的存在是为了什么、有什么优点吗?
5、说说多态实现原理
6、纯虚函数的作用、为什么要有纯虚函数(他又问,虚函数也可以重定义呀,纯虚函数出现到底是为了什么,他又讲到java的接口)
7、C++类型转换方式有哪些?分别说说。dynatic_cast失败会怎么样?什么时候返回空,什么时候抛出异常
8、空类。编译器会为之生成什么成员?(中间还讨论到:我说默认构造函数只有在编译器需要的时候才会产生。
他问我你什么意思默认函数就是编译器会自动生成的啊?)【难道默认构造函数不是只有编译器需要时才产生吗,哼】
9、说说对虚析构函数的理解?什么时候要把析构函数声明为virtual
10、平常用什么容器?说说常用的容器。vector的底层实现、扩容原理、size、capacity、resize、reserve四个函数
11、map底层实现、unordered_map底层实现?哪个写(插入、删除)快?
各个容器迭代器失效的情况。
12、程序运行出错,抛出异常,怎么调试?用过什么调试工具?gdb调试?(程序运行出错,会生成一个什么call(音译)文件???
面试官说的什么call(音译)文件是什么?)
13、知道什么智能指针?说说shared_ptr实现原理、线程安全不?
14、说说你理解的进程、线程?进程的内存分布?孤儿进程?
15、怎么理解物理内存、逻辑内存?如果中国每个人都有e-mail,把所有人e-mail都存到内存中,存得下吗?(13亿人,每人20字节,估算共多少内存)
16、多线程
17、数组与链表
18、给一个无序数组,求排好序后得每个元素在有序序列中的下标,要求原数组元素顺序不变?
给一个有序数组,从中拿出一个子序列(无序),求其排好序后在原数组的下标
19、一条记录有十个字段,一个文件***十亿条记录,要求把每个字段放到一个文件中,怎么办?

1、照例自我介绍;
2、项目;
3、做项目途中遇到的困难;
4、值传递和地址传递;
5、指针和引用;
6、const int *p和int * const p的区别;
7、C里内存的五个分区,着重讲一下堆和栈的区别(趁势又讲了一波为啥值传递swap函数传不成功,因为在栈区,结束会销毁);
8、C语言局部变量在堆区还是栈;
9、C++中类里static成员变量与普通的成员变量有什么不同;
10、静态函数呢?
11、静态函数访问普通成员变量和静态成员变量/普通成员函数访问普通成员变量和静态成员变量;(我自己这块也是糊的,就被绕晕了)
12、知道STL吗?讲一下STL里的list;
13、TCP跟UDP(区别,TCP的三次握手,为啥要三次没问,但是我抢答了)

1、定义一个链表;
2、在他给定的链表内实现删除某个指定值的节点(一紧张就直接背剑指上的写法了,写完小哥哥说我并没有定义要被删除的节点,定义的是要被删除的值,然后请大家注意各种边界条件啊!被小哥哥批评不考虑整个链表只有一个指针的情况)
3、定义一个二叉树;
4、二叉树的前序遍历;(写代码的规范性啊,缩进没注意也被批评了)
5、二叉树的深度优先遍历;
6、两个栈实现一个队列;
7、找1000个数里最大的K个数(惨兮兮的用最大最小堆在做,写了一半小哥说你直接用map不就完了,我说没成想能用STL的函数)
Q:sizeof和strlen的区别?
A:你们都懂得
Q:一个int大概多大?
A:32位4个字节,64位8个字节
Q:int在内存中字节排布?
A:小端序
Q:虚函数指针什么时候会出现?
A:在有虚函数的时候~
Q:static的作用?
A:都懂得,这里不展开了
Q:多个进程同时监听一个UDP端口会怎么样?
A:不懂……
Q:你可以了解一下这方面。进程的内存结构?
A:内核、栈、动态链接库、堆、静态区、代码段、保留区
Q:静态变量和全局变量在哪个区?
A:静态区……
Q:++i和i++的区别?
A:++i效率比较高。
Q:虚基类和普通基类的区别?
A:菱形继承问题
Q:空类的大小?
A:1byte
Q:为啥?
A:不懂…
Q:引用和指针的区别?
A:都是用指针实现的。
Q:进程间通信?
A:socket, 管道,消息队列,共享内存
Q:TCP三次握手?
A:讲了讲(忘了讲状态转移)

 

  • new/delete和malloc/free的区别
  • vector的结构?vector拷贝时发生什么
  • 一个数组,只有一个数字出现奇数次,其余数字出现偶数次,如何得到这个数字?如果出现奇数次的数字有2个呢?
  • 给定一个ip地址,编码使得ip和32位整数呈双射关系
  • 50个红球50个蓝球,放到2个袋子里,从两个袋子各取1个球,让2个都是红球的概率最大,怎么放
  • 进程和线程的区别
  • 学过操作系统吗?学过网络吗?没有
  • 时间复杂度为O(nlogn)的排序算法有哪些?简述快速排序的过程
  • C++内存分布
  • 重载和重写的区别
  • Linux下删除同一文件夹下所有满足条件的文件
  • 1个32位无符号整数,计算二进制格式下有多少个1,不通过循环怎么做
  • cmake和makefile的区别
  • 简述cmake到可执行文件的过程
  • 进程和线程的区别
  • git pull和git fetch的区别
  • 学过操作系统吗?学过网络吗?没有
  • 用数据结构模拟浏览器前进后退的操作
  • 2g物理内存,new一个3g的数组时发生什么?
  • 平衡二叉树的特性,红黑树的特性,判断是否为平衡二叉树
  • 虚函数和纯虚函数
  • 智能指针如何实现
  • 进程和线程的区别,多线程和多进程的优缺点

编写shell脚本  查看一个文件,大小大于10M就删除,否则打印内容   不会,谢谢
core dump,出现段错误的原因
哈希表 如何实现 冲突解决
hash table用什么实现,最差插入时间复杂度
函数值传递一个百万个元素的vector会怎么样?为什么?
c 内存分布?

一个二维地图,每个格子有不同分数,求机器人从左下到右上的最大分数的路径。

求一个数组逆序对
三次握手四次挥手的状态字,为什么3次,为什么4次
求最大连续子数组
一次完整的http链接过程,应用层到数据链路层,越详细越好
http https区别
设计模式的了解,单例模式

成员函数的前后const
算法 最短路径

虚拟内存和物理内存的区别
进程线程区别?
谈谈项目中的多线程和线程池?
3、linux下如何快速将文件每行倒序输出?shell或者编程都行,说了下python和c++实现方法,结果人考的是tac命令
4、手撕代码-输出字符串中最长的回文子串长度?写完了不会优化
5、TCP-UDP区别?
描述四次挥手过程,以及timewait、closewait?
timewait过程如果出现过多拥塞或者网络不稳定导致很多非正常数据该如何解决?
linux下如何查看特定端口有多少tcp连接?
6、手撕sql查询排序?
如何通过索引优化该sql?
谈谈Innodb中b+树?myisam和Innodb中b树有什么区别?
7、了解数据结构?图如何表示?图广度遍历用什么结构?
1、char (*p) [] 、char *p[]、char (*p)()的区别?
2、熟悉设计模式?手写下单例模式?
3、手撕代码int atoi(char *str)?
4、谈谈web上访问网址的过程?
说说DNS如何找到ip和port的?若本地和局域网查找不到,如何向上层查找(DNS服务迭代查询和递归查询的流程)?
谈到socket通信,说说握手过程,为何三次握手?
谈到get、post了,get和post的原理和区别?
直到http和http2区别?
熟悉https,https中加密实在哪一过程进行了?
说说ssl加密原理?
5、说说select、poll、epoll区别?
6、熟悉句柄么?程序执行后句柄如何处理,如何修改可打开句柄数量?
7、数组存中在一个大于n/2次的数,如何以最优方法查找它?
8、用栈实现队列,用队列实现栈?
9、如何设计一个高并发的分布式服务器?
10、64匹马、8赛道,知识多少轮比赛找出速度最快的4匹马?(在提示下优化到12次,最优解为10或者11次)

1. 1G内存,4G url,求重复的url
2. 手写二分
3. Linux命令,find,grep,ps,netstat…
4. Python的tuple
5. C 与Cpp的区别
6. const/define
7. C语言内存布局

1.死锁是怎么产生的
2.有没有写过多线程?
3.调度算法有哪些?
4.三次握手四次挥手画图解释一下
5.UDP和TCP区别
6.HTTP和HTTPS介绍一下,区别是什么?
7.HTTPS的安全性是怎么实现的?
8.HTTP有哪几种操作?

Q:TCP三次握手和断开的完整过程
A:(答案网上很多)最后答了一下客户端处于TIME_WAIT状态要等2个MSL才会close
Q:为什么要等2个MSL
A:(答案网上找)
Q:输入www.baidu.com在浏览器的完整过程,越详细越好
A:(网上也有)
Q:说一下cache吧
A:LRU那种?
Q:是的。
A:因为java里面有一个数据结构linkedhashmap这个是很符合LRU的,然后按这个的源码说了一下,主要是hash+链表。
Q:这个怎么实现同步和互斥,怎么样去加锁
A:然后说了一下锁的相关知识,balabala
Q:c++里面的同步和互斥怎么实现的
A:mutex,条件变量之类的说了一下,消费者生产者之类的举了个例子
Q:c++里面的常量怎么定义
A:const和constexpr(这个面试官可能没见过,然后解释了一下)
Q:我主要想说宏
A:这个不算常量,在编译器就已经被全局替换。然后说了一下宏的某些缺点,我一般不会用,balabala
Q:c++的智能指针说一下,区别
A:balabala
Q:c++怎么实现一个函数先于main函数运行
A:用static,balabala
Q:c++的static的变量的初始化顺序怎么样的
A:声明顺序就是初始化顺序
Q:如果一个类里面呢?
A:这里我答错了,我以为是初始化列表的顺序。。。。。。。。(第一次答错)
Q:两个文件,两个static变量a和b,怎么让某个变量先于另外一个初始化呢?
A:通过头文件的声明顺序
Q:其他用户不知道头文件的声明顺序怎么确定呢?
A:不知道。。。。(第二次没答出来)
Q:来一条设计题。百度搜索的智能提示怎么实现,输入两个字,出来一些热搜
A:字典树+堆吧,然后balabala(第三次。。。感觉面试官不是很满意我的答案)
Q: STL说一下
A:balabala

  1. 自我介绍
  2. C++拷贝构造函数为什么传引用
  3. 如何返回值一个类的构造和拷贝构造
  4. 如果声明为私有的,那么是编译时错误还是运行时错误
  5. vector越界访问下标
  6. map越界访问下标
  7. 如何删除map中的奇数节点
  8. 指针和引用的区别
  9. C++中内存泄漏问题
  10. new和malloc的区别
  11. TCP断开连接过程,timewait解释
  12. HTTP中状态码 302(详细问) 403 400
  13. 连续子数组最大和问题
  14. 实习负责的模块是什么?遇到了什么问题和挑战?
  15. C++多态,虚标指针在什么时候初始化
  16. STL库的容器底层实现
  17. 红黑树的插入效率,为什么相对平衡的红黑树比绝对平衡的AVL适用广
  18. B树和B+树的区别,B+树应用在哪?
  19. 哈希表的哈希冲突,解决哈希冲突的几种方法
  20. 进程间通信方式,每个都讲一下
  21. 网编程讲一下。
  22. select和epoll,epoll底层实现,数据的拷贝方式。
  23. 求一个数开根号(二分)
  24. 讲一下timewait状态,没有timewait有什么问题
  25. 滑动窗口和拥塞窗口
  26. 慢启动和快重传
  27. 实现一个功能,能检测内存泄漏问题,通过一个指令输出整个进程中哪一行哪个函数申请了多少内存,按照顺序排列出来,还有总的内存数
  28. 虚基类
  29. 纯虚函数
  30. 虚函数
  31. 虚函数表内存分布
  32. 虚函数中虚基类和派生类的关系
  33. 显示转换
  34. 问了三个算法题 讲讲思路
  35. 学过网络和操作系统吗
  36. 三次握手,四次挥手 握手为什么是两次
  37. 讲一讲拥塞机制 和流量机制
  38. http https抓包工具原理
  39. IP地址分为几类?简单说一下分类
  40. 进程通信有哪些方式
  41. 进程同步的方法
  42. 知道互斥锁吗?

    他用什么来保证共享数据的安全性?

    这个我说信号量,他说如果用信号量来解决,现在出现一个状况,两段进程都被标记为可以访问该共享数据,但我们的共享单元只能支撑一个进程访问。这时候怎么办?

    我说用唯一标识符去处理。生成唯一标识符,这样就不会出现这种情况。

    他说不对。让我回去好好看看。

    回去查了一下,是原子操作。。

    1. 为什么继承时基类的析构一般声明为虚函数?
    2. 虚函数与纯虚函数的区别在于
    3. 为什么构造函数不能够使虚函数

    4.TCP端口扫描方式

    5.TIME_WAIT、CLOSE_WAIT

    6.守护进程

    7.迭代器的++it和it++哪个好

  43. 讲讲快速排序的思想。

    我 balabala

  44. 讲讲归并排序的思想。

    我 balabala

  45. 如果给你 一亿个数字,找出最大的前 20 个。(TOP K 问题)
  46. 如果我只要第二十个怎么优化。
  47. 如果给你一个文件,文件里有上亿个无序字符串,设计一个算法把上亿个字符串进行排序。接着把这个有序的字符串输入到一个新的文件当中。(内存有限制)
  48. 让我讲讲我理解的线程。
  49. 多线程对公共资源同时访问。(线程安全,同步互斥)
  50. 问我了解没了解过递归锁。
  51. C++ 11 有没有了解,讲讲。
  52. 讲讲虚函数、纯虚函数。
  53. 你懂 java 吗? (楼主是真的不懂。面试官也就没深问。)
  54. 一个函数返回值为 bool 类型。但是返回 true 与 false 的概率不是百分之五十对百分之五十。要求利用这个函数设计一个新函数,使得新函数的返回值的概率为 50%。

 

1面

1面面试官问得比较简单
1.const
2.static
3.写一个memcpy
装一下 讲了字典树和跳表
讲一些具体实现

2面

1.手写memcpy.
2.进程间通信
3.在TCP报文的画出三次握手的全过程。
4.一道智力题:100层楼,有两个玻璃球,有唯一一层,从该楼层及以下楼层扔下玻璃球不会碎,从该楼层以上扔玻璃球会碎,请用用两个玻璃球找出该层(最小的时间复杂度)。

后面就问tcp udp
线程进程
最后问了一个算法
象棋中马从A到B最短走几步
答bfs
问可否优化
想不出就说还是bfs 不过先建表算出来放表里存着直接查

 

一面:
0)自我介绍?
1)如何用数组实现链表的功能?(数组中存放一个结构体,一个表示数据,另外一个表示其下一个节点在数组中的index,以便于快速插入删除)

2)linux下有哪些信号?
3)https中的pipeline?多个相同请求的时候一次返回
4)函数指针的作用?
5)如何实现一个非定长的结构体? -长度为0的数组(a[0])

6)strcpy实现方法及其缺点,strncpy?
7)野指针?

8)linux io和标准io区别?

9)http网址访问过程,get post区别?
一面大概只记得这么多内容了,大约30-40分钟的样子,有两种面试官,一种调出笔试题让讲算法和错题的,另外一种直接怼基础的,总体上不太难。
二面:
0)简单自我介绍?

1)讲熟悉的项目,讲讲项目难点?
谈谈io复用,select?
谈谈项目共享内存实现方法?
2)linux 下编译调试方法,如何调试内存泄露问题?
3) 给几百万个网址,如何高效找出特定网址是否在其中?(布隆过滤器)
布隆过滤器优缺点,如何解决其缺点?
4)给一容量较大非法单词词典,如何判断某输入中是否有非法单词?

建立字典树–实现一次遍历就可做出判断
1、画堆排序过程,复杂度分析。
2、画平衡二叉树建立过程。
3、画红黑树构造过程。(这个不会了。。。)
4、虚析构作用。
5、什么叫重载,继承,隐藏。
6、什么函数不能声明为virtual。
7、extern C的作用。
8、讲一下快排。
9、算法题,O(n)内旋转字符串。
10、算法题,文件中有大量数字,排序并保存到结果文件中。
11、memcpy的实现。
12、TCP快重传。(记成快恢复了。。。)
1.sizeof 各种基本类型 结构体 类2.继承和多态

3.栈在实际编程的时候有哪些应用场景

4.广搜用什么数据结构

5.浮点数判断是否相等

6.手写代码 字符串反转 有时间和空间复杂度限制

7.手写代码 字符串循环移位 面试官让优化复杂度 没想出来(要用到上一题的字符串反转)

8.统计一篇英文文章出现频率最高的十个单词

9.new和malloc

10.智力题 4刀把一个圆柱形蛋糕切16块

11.实现strcpy,要考虑内存重叠和特殊情况处理

 

Q:象棋中马从一个位置跳到另一个位置的最少步数
A:手写BFS

Q:一次可以上一层台阶,也可以上两层台阶,到第N层有多少种走法
A:F[N]=F[N-1]+F[N-2]

Q:一分钟内经过公交车的概率为p,求三分钟内有公交车经过的概率
A:P=1-(1-p)^3

Q:strcpy和memcpy的区别
A:复制的内容不同,strcpy无需指定长度,遇到’\0’为止

Q:那strncpy呢?
A:我没用过

Q:你怎么判断两个struct相等?
A:我会选择重载==运算符,逐一比较成员变量是否相等

Q:那能不能用内存比较memcmp来判断呢?
A:不能,涉及字节对齐,可能有内存间隙,这里的值是随机的

Q:进程间的通信有哪些方式?
A:管道、有名管道、(信号、信号量、)共享内存、消息队列、socket

Q:epoll和select/poll的区别
A:epoll是实现I/O多路复用的一种方法,有水平触发(level trigger,LT,默认)和边缘触发(edge trigger,ET)两种工作模式,区别在于两种模式的返回就绪状态的时间不同。水平触发和select/poll的方式一样

  • 水平触发
    • 读:缓冲内容不为空返回读就绪
    • 写:缓冲区还不满返回写就绪
  • 边缘触发
    • 读:
      • 缓冲区由不可读变为可读
      • 新数据到达,缓冲区中待读数据变多时
    • 写:
      • 当缓冲区由不可写变为可写
      • 当有旧数据被发送走,即缓冲区中的内容变少的时候

epoll之所以高效,是因为epoll将用户关心的文件描述符放到内核里的一个事件表中,而不是像select/poll每次调用都需要重复传入文件描述符集或事件集。比如当一个事件发生(比如说读事件),epoll无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入就绪队列的描述符集合就行了。

Q:在TCP连接中,服务端的socket要做哪些?
A:socket->bind->listen->accept->send/recv

Q:堆和栈的区别?
A:堆是一颗二叉树、栈是一个单向进出的线性结构

Q:堆排序和快排的区别?
A:快排的思想是分治,每次选择当前范围的第一个数作为标杆,然后再将这个范围的所有比它小的数放到他左边,大的放到他右边,由这个标杆的现在位置划分出两个范围,分别对这两个范围的数再重复这样的*作,直到范围大小为1
堆排序则是在建堆的时候保证堆顶最小,然后每次取堆顶

下面应该是面试官自己出的一些题目

Q:XML是什么结构?
A:树

Q:用过正则表达式吗?写一个32位IP地址的正则
A:用过,忘记了不好意思

Q:进程和线程的区别?
A:这个没背,只回答上了几句话

 

 

1、第一个问题,怎样统计一篇英文文章中出现频率最高的10个单词,用什么数据结构和算法实现,因为是第一个问题,很紧张,答得有点语无伦次,面试小哥倒是忍了,跟我说不用说这么细,说个主要思路就可以了。

2、为找出一个字符串中第一次出现的指定字符,怎么优化算法。一脸懵逼,甚至想出了两端遍历的方式,然后小哥提醒我是第一次出现的。。。然后我就随口胡诌了一个。

3、结构体的比较问题,之前也有老哥说过。

4、根据主要用的编译环境,我是windows,他问了debug和release的区别,我就说一个会忽视ass断言一个不会(太激动还把断言说成了警告。。。)。然后又追问另一个问题,我都忘记是啥了。。。

5、main函数有没有返回值,分别针对什么情况。这个比较简单没啥好说的,然后他直接追问,那么如果出现异常,怎么捕获,然后我就懵逼了。。。

6、下一个问题更懵逼,问C++写的动态链接库能不能直接给C用,为什么。。。我就说,您既然这么问了,那肯定不能,但我也不知道为什么,因为平时使用的时候C++可以支持90%的C操作,然后就没有然后了。

7、问我有没有学过计算机网络,我说学院没开,做项目的时候用过,所以自学了一部分,然后面试官很贴心的问了个基础的问题,TCP的三次握手。这个应该都有准备过,然后又问了一下几次握手中,两端的状态转换,以及为什么两次握手不行。

8、最后问了一个关于C中宏定义的问题,前面老哥们有说过。