面经问题来源
开放地址法插入哈希表,要求元素不能重复,表的长度调整当然也得考虑
开放地址法:当hash冲突发生时,在hash表中找空位插入。
开放地址法有三种:
- 线性探测
- 二次探测(也叫平方探测)
- 伪随机数法
如果hash表中有相同的元素则不插入
哈希表怎么扩张、插入和删除
扩张:redis的hash表扩张方法如下。
当原Hash表的装载因子==1,则新建一个hash表,将原hash表中的非桶中元素移动到新hash表中,然后再插入新元素到新hash表,这样做可以避免插入元素操作因为hash表扩容而等待过长时间。
插入:先根据给定的输入入计算一个hash值,然后在hash表中找到该hash值对应的位置,查看是否有相同元素或hash冲突,有冲突则处理冲突,有相同元素则不插入。
删除:根据给定输入在hash表中查找位置,如果找到该元素,则从该位置删除该元素。
智能指针
智能指针:能自动释放内存的指针。
C++中的智能指针有三种:
- shared_ptr:允许多个指针指向同一个对象
- unique_ptr:指针独占对象,不允许共享
- weak_ptr:弱引用。
const和constepr
const指的是编译期常量和运行时常量,两者并没有区分
constexpr特指编译期常量
n个数找最大或最小的k个
堆排序
n个数里面删k个,求剩下的数里面能组成的最大数
用堆排序删除最小的k个即可
树的后序遍历非递归版
思路:递归的本质是将函数的调用进行入栈,执行按照出栈顺序执行。故,这个题目的意思是让我们自己构建这个栈。按照后序遍历的顺序,先将左孩子入栈,直到叶子节点,然后访问并出栈,每出栈一个元素,就要检查栈顶是否有右孩子,有的话要入栈,右子树同左子树的过程一致。
TCP和UDP的区别与联系
知乎
总结如下:
- TCP是可靠的,UDP不可靠。
- TCP是面向连接的,UDP是面向报文的。
- 对系统资源的要求(TCP较多,UDP少)
- UDP程序结构较简单
- 流模式与数据报模式
- TCP保证数据正确性,UDP可能丢包;
- TCP保证数据顺序,UDP不保证。
一个文件里某函数a()调用另一个函数b(),中间发生了什么描述下(汇编层面)?函数是怎么保存当前堆栈状态的?
百度知道,感谢大佬
函数(如strlen)的名称类似变量名称,指向内存中某个地址。区别在于变量指向的目标是某个值,函数名指向的目标是某段代码。函数被调用前,调用者(如main)将当前代码执行位置压栈,跳向内存中函数代码位置执行之后返回堆栈中保存的调用者(main)的原执行位置,弹栈后继续执行。
另,用户函数和系统函数在编译时一般是分开存放的。
最大递增子序列动态规划的状态方程,分析怎么得出来的
def LongestSub(a):
# 求a的可以不连续的最长递增子序列长度
n = len(a)
dp = [1 for i in range(n)]# dp[i]表示从0到i的最长递增子序列(可以不连续)长度
Max = 1
for j in range(n):
for i in range(j):
if a[i] < a[j] and dp[i] + 1 > dp[j]:
# a[j]这个位置结尾的最长递增子序列,应该是0-(j-1)的所有截止位置小于a[j]的最长递增子序列长度中最长的长度+1
dp[j] = dp[i] + 1
if dp[j] > Max:
Max = dp[j]
return Max
a = '1232456'
print(LongestSub(a))
C 11新增特性?move语义?非类型的模板写一个我看看?
C++11新特性
move语义:拷贝+清除原指针内容
一个算法实现判断两个矩形是否有重叠(两个矩形可旋转)
手撕一个数组扩容Java
class Arr{
private int[] a;
private int len=100;
private float cover=0.8;
private int top=0;
Arr(){
a = new int[len];
}
public void add(int k){
a[top++] = k;
if(top>=cover){
len = 2*len;
a_new=new int[len];
for(int i=0;i<top;++i){
a_new[i] = a[i];
}
a=a_new;
}
}
public int pop(int idx){
temp = a[idx];
for(int i=idx; i<top; ++i){
a[i]=a[i+1];
}
return temp;
}
}
将矩阵中三角形区域的点都标为1(其他为0)
前提:给定三角形的三个端点p1,p2,p3和一个矩阵,矩阵中元素全都为0。
思路:用向量外积。对于给定的三个端点,可以得到x轴和y轴的范围,对这个范围进行穷举。每次得到一对(xi,yi),即一个点pi;计算向量<p1,p2>,<p2,p3>,<p3,p1>;分别计算<p1,pi>和<p1,p2>的外积,<p2,pi>和<p2,p3>的外积,以及<p3,pi>和<p3,p1>的外积;当且仅当这三个外积的结果都大于等于0时,点pi在p1,p2,p3三个端点围成的矩形内部或边界上,则标记为1。
二面准备
面经来源-知乎
0)自我介绍
1)说说你比较有成就的一个项目
2)你对STL了解吗?是通过读源码吗(STL源码剖析)?通过这本书,学到了什么?
百度知道
菜鸟驿站教程
C语言中文网
3)说说你最擅长的三个方面
4)B+、B-树了解吗?(不太了解,知道avl树和红黑树)
CSDN-多种B树总结
CSDN-点赞较多
二叉树的各类计算公式
5)什么时候读的UNIX网络编程和Redis设计与实现?
6)Redis事务支持到什么程度(不会)
7)Redis的持久化?(RDB和AOF)。RDB怎么实现的?
8)读Redis的源码了吗?(读了一部分)
9)主从服务器如何同步?如何发现主服务器掉线?谁来发现?如何实现?哪个服务器来实现?(????懵)
10)主服务器故障,在从服务器中如何选举一个新的主服务器?(a:从服务器直接向邻居拉选票;q:会出现死锁,怎么解决?a:发送的数据包带时间戳;q:时钟不同步呢?a:那就根据各个从服务器的数据状态。)
11)设计一个分布式邮件系统,包括一对一发送和群发功能?(面试官递过来了纸和笔,慌的一批)
12)1g数据的文本文件,不知道行数,每行都是一个整数,求和?可以使用电脑一台,4核。(ans:哈希成四份文件?ques:效果可能更差,再想想。… 懵)
13)求和的那题。 比较耗时的是那部分?(ans:字符串转为整数。ques:嗯,不是,I/O最耗时,再想想?…继续懵)
14)设计模式了解哪些?(Reactor、Observer)
15)C++11了解多少?
简书
知乎
CSDN
16)有没有经历过比较大的打击?
17)职业规划?
18)薪资待遇?
19)有没有收到其他offer?
20)还有什么问题吗?简历留下,面试结束。这周或下周给结果。等消息吧。
二面部分后续整理
1.笔试题哈希表扩张,怎么插入,怎么rehash的,细节呢?
2.聊了一些实习的公司的事,就当是缓和气氛?然后开虐?
3.设计一个timer(float dt, function<> callback)函数,传入时间和函数指针,到指定时间后调用函数(学过cocos的都知道,就是设计scheduleUpdate),我直接算执行每个回调需要的具体时刻,然后放最小堆了,不知道对不对。
4.设计完了?你确定?描述下?然后呢?怎么优化?
5.一个黑白颜色各占一半的转动的圆盘,可以在上方随意放检测下方颜色的传感器,最少放几个可以知道是顺时针还是逆时针转?
6.聊项目,聊cocos,为什么每个node需要visit()?干嘛用的?cocos内存管理?PoolManager干嘛用?
7.用过哪些设计模式?组合和继承区别?各自优缺点?(我就是扯引擎用到的那些)
8.字符串翻转。
9.为什么之前选择去棋牌公司实习?不是浪费时间嘛?不过你干的活倒也不是完全没含金量(一边看着我的简历),…