小米一面面经
1、印象最深的一个项目。
2、Python中list和tuple的区别是什么?
声明方式不同,列表用[]声明,元组用()声明。
列表内的元素是可变的,元组内的元素时不可变的。
注意:
元组中的元素值是不可以修改的!但是可以对元组进行连接组合。
元组中的元素值是不允许删除的!但是可以使用del删除整个元组。
3、Python中的迭代器和生成器分别是什么?
迭代器
迭代器是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完。迭代器只能往前,不能后退。
迭代器的两个基本方法,iter()和next()。
生成器
使用了yield的函数被称为生成器。
生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器运行的过程中,每次遇到yield时,函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法时,从当前位置继续执行。调用一个生成器函数,返回一个迭代器。
4、设计模式知道哪些?讲讲单例模式的用处?
- 无序列表内容
- 无序列表内容
- 无序列表内容
5、MySQL和Redis的区别是什么?
数据库类型
- MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度慢。
- Redis是非关系型数据库,也是缓存数据库。将数据存储在缓存中,缓存的读取速度块,能够大大的提高运行效率,但是保存时间有限。
数据库作用
MySQL作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在I/O操作,如果频繁的访问数据库:第一,会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二,反复的访问数据库也会导致数据库的负载过高。
Redis数据库是一种缓存型数据库,用于存储使用频繁的数据,这样可以减少访问数据库的次数,提高运行效率。
6、MySQL的引擎是什么?
- InnoDB
- 该引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
7、linux显示当前路径的指令是什么?
- pwd
8、查看资源使用量的指令是什么?
top命令
- 能够实时显示系统中各个进程的资源占用情况。
ps命令
- 用于报告当前系统的进程状态。可以查看**哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。
pmap命令
- 用于报告进程的内存映射关系。
free命令
显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。
9、返回家目录的指令是什么?
- cd ~
10、TCP连接中滑动窗口的作用是什么?
- 用于进行流量控制,防止接收方来不及接受数据,造成网络丢包和网络拥塞等情况。
11、输入一个url的过程是什么?
浏览器向DNS发出请求,解析该url的ip地址。
DNS解析出ip地址后,浏览器和服务器简历TCP连接。
浏览器和服务器之间进行请求和响应等操作。
释放TCP连接。
浏览器将拿到的数据进行渲染,显示界面。
12、DNS和Mac地址有关系吗?
没有关系。
- DNS是将域名和IP联系起来;而ARP是将IP和MAC联系起来。一个在应用层,一个在网络层。
- ip地址的目的是为了解决网络与网络之间的通信。而mac地址则是为了解决相邻主机间的通信。
13、ARP欺骗是什么?
背景
- 两个计算机在同一局域网时,发送方需要知道接收方的MAC地址。如果发送方不知道接收方的MAC地址,就无法发送信息,这时就要询问ARP。ARP会在局域网里向所有计算机广播,找到接收方的MAC地址。
原理
- 主机之间在传递消息时,发送方得先问ARP找到接收方的MAC地址才能发送。ARP向局域网中的所有主机广播询问接收方的MAC地址。这个询问包含了发送方的IP和MAC地址,黑客如果在这个局域网中,也会收到ARP Request,从而得知发送方的地址。这样,黑客就可以冒充别的主机,进行欺骗活动,截取数据包。
14、写一个生成器函数。
def helper(n): i = 0 while i<n: yield i i += 1 f = helper(5) while True: try: print(next(f)) except: print('over') break
- 输出
0 1 2 3 4 over
15、写一个单例模式。
单例模式的主要目的是确保某一个类只有一个实例存在。
使用模块实现单例模式。
- 因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,会直接加载.pyc文件,而不会再次执行模块代码。因此,我们只需要把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
class Singleton(object): def foo(self): pass singleton = Singleton()
- 将上面代码保存在文件demo.py中,要使用时直接在其他文件中导入此文件中的对象,这个对象即为单例模式的对象。
from demo import singleton
- 使用装饰器实现单例模式
def Singleton(cls): _instance = {} def _singleton(*ars, **kwargs): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) return _instance[cls] return _singleton @Singleton class A(object): a = 1 def __init__(self, x=0): self.x = x a1 = A(2) a2 = A(3)
16、合并两个有序数组。
def mergeList(arr1, arr2): if len(arr1) == 0 and len(arr2) == 0: return [] stack = [] p1 = 0 p2 = 0 while p1<len(arr1) and p2 < len(arr2): if arr1[p1] <= arr2[p2]: stack.append(arr1[p1]) p1 += 1 else: stack.append(arr2[p2]) p2 += 1 while p1 < len(arr1): stack.append(arr1[p1]) p1 += 1 while p2 < len(arr2): stack.append(arr2[p2]) p2 += 1 return stack if __name__ == '__main__': arr1 = [1, 3, 5, 7, 9] arr2 = [2, 4, 6, 8, 10] result = mergeList(arr1, arr2) print(result)
17、最近有什么爱看的书籍?
18、对小米工作环境的看法。
19、为什么选择测开?对自己以后的规划是什么?
20、有什么要问的?
21、Python中的字典怎么获取默认值?
setdefault()方法
- dict.setdefault(key, default=None),如果键不存在于字典中,将会添加键并将值设为默认值。
22、Python中给怎么给列表元素去重?
lis = [1, 2, 2, 2, 3, 4] lis = set(lis) lis = list(lis) print(lis)
- 输出
[1, 2, 3, 4]
23、TCP拥塞控制的方法有什么?慢开始是怎么工作的?
24、B树和B+树了解吗?