面试总结
.1 两道试题
- 使用random7()来写出一个random10()
- void print_all_prime_less_than(int n)
.1.1 random7
我的解法,想了大概9min左右,写出正确的伪代码,但不是最优(估测的,因为和面试官交流的总时长约46min)
1 因为random7要表达出10种随机数字,第一次我的想法就是
做一次加法random7+random7
但是发现这样的随机结果并不符合 “伪均匀分布”
也就是说得到的结果是2~14,13种结果不是等可能的
2 进一步我想到了7*7=49种 等可能
然后我就想着random7*random7,想法很快
但是发现结果并不如我所预料的那样是49种等可能
这尼玛就让我很心急,然后就卡在这里了
不过后来还是强硬的撸出来一种解法:random7*random7得到的结果中
2=1*2=2*1
3=1*3=3*1
5=1*5=5*1
7=1*7=7*1
...
类似的数字满足的条件是:由1~7相乘得到
且random7*random7得到此数的结果 的可能性是2/49
类似的数字,当时粗略一数,超过了10个
于是解法就出来了,10个等可能(概率为2/49)的随机数字映射到1-10就可以得到random10
------------------------------事后诸葛亮的分割线-----------------------------
3 得到等可能结果的方法 两种
- 3.1 构造一个元组(random7,random7),想象成一个7*7的网格点
- - 每个点都是1/49的等可能性,每4个映射1-10的一个数字,就可以得到 等可能性为4/49 的十个随机数字了
- 3.2 元组构造起来可能会消耗时间空间一点,那么我们可以更进一步,构造一个7进制的2位数
- - 7^1 数位上面 是 random7-1 记做A ; 7^0 数位上面亦是 random7-1 记做B
- - A*7+B 会从7进制的00,一直等可能遍历到7进制的66 (其实也就是3.1的49个网格点)
- - 当然 ,为了便于处理7进制的00~66 我们是用10进制计算得到的
- - - 所以也就是0~48,构造出49个等概率数字之后,后面就不多说了
具体实现,略
测试,略
.1.2 print_all_prime_num
我的解,想了7min左右,写出正确的伪代码,不清楚是不是最优
def is_prime(n):
for i in range(n^0.5): # 开平方的意义在于......自己体会,不想写那么多字
i = i+2 #总不能让0和1去验证 能不能被n整除吧,肯定从2开始
if (n%i == 0): #找着一个能整除的,那就不是质数
return false
#如果这个循环跑完,没返回,那n就是质数
return true
#随后再从2~n进行一次遍历,每个数字i 用一次 is_prime(i)
#把所有的质数找出来,就完事儿了,总体时间复杂度n^1.5
#当场我自己的一个改进版本,把得到的质数,存在一个数组里面
#然后 每次呢就从这个 数组 和 range(n^0.5)取交集 的结果 来对n看是否整除
#这样能把n^0.5 的时间复杂度再度大大缩短成为 近乎 常数 的时间复杂度
# 从这个角度出发,我的实现方式几乎是已经达到O(n)
# 感觉可能已经接近最优了,后面有时间再去看下 更优的 解法
.2 C++一些其他特性 & 项目经历
-
纯虚函数 多态的实现机制 -->当时没有回答的很好,关键字就是“虚函数表”
-
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数 1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。 4:多态用虚函数来实现,结合动态绑定. 5:纯虚函数是虚函数再加上 = 0; 6:抽象类是指包括至少一个纯虚函数的类。 纯虚函数:virtual void fun()=0;即抽象类!必须在子类实现这个函数 # org_article = "https://www.cnblogs.com/alinh/p/9636352.html"
-
项目经历 (要有条理的描述出来整体架构 和 自己所负责的部分)
-
# 再慢慢整理吧
-
指针和引用的区别 (不只是说 引用 是 常指针 这么简单) -->以下内容都有待商榷,需要逐条核实理解
-
- ”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小 - 指针和引用的自增(++)运算意义不一样 - 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏 - 指针和引用作为函数参数进行传递时的区别 - - 这个比较复杂,一下子也不太好记下来
-
C++为什么要搞那四种转化,这么麻烦?
-
# todo
.3 自己的情况
- 毕业为啥不直接进it? --> 没能进去
- 在武汉挺好的 干啥想着来深圳 房价贵 --> 闯一闯 , 深圳厉害的人多