面试问题集

  最近在找工作,求职岗位是机器学习算法工程师或者python开发工程师,我想把在面试中遇到的问题记录下来,将来工作之后再回来看看一定别有一番滋味。答案不甚完美,希望各位大佬多多批评指正。

一. python语言

1.解释一下装饰器:为函数添加新功能而不用更改函数定义。形式上看函数的输入和输出都是函数的函数,当然也属于高阶函数。
2.用什么进行python调试:断点。可以用pdb中的set_trace()来设置断点,也可以使用IDE中断点功能。
3.深拷贝和浅拷贝的区别:浅拷贝只会拷贝父对象不会去拷贝父对象下的子对象,故存在内存共享的问题;深拷贝会逐层拷贝,能实现完全的独立拷贝。实现方式是copy模块。什么时候用拷贝呢?当你不是仅考虑数据的引用而是想把数据与原始数据独立开来时应当用拷贝,其他时候用引用即可。
4.什么情况下使用浅拷贝和深拷贝呢:当数据是组合可变类型数据且你想把数据独立存储起来时应当使用拷贝,否则用赋值就行
5.如何使用hash表实现python字典:解决hash冲突方法,开放定制法和链表法,
6.链表和数组有啥区别:1.链表是链式储存,数组是顺序存储。2.数组需要事先指定内存大小,链表不需要它可以进行任意的扩展。3.数组相比于链表占用内存更小。4.数组内的数据可以通过索引随机访问也就是我们可以通过内存的起始地址和内存的大小通过数学公式快速访问到而链表访问就不那么方便了它需要从head依次进行顺序访问不能随机访问。5.数组查找数据快于链表,但是删除和插入操作慢于链表,因为它删除和插入都要移动很多数据,而链表却不需要。
7.什么时候用链表或数组:当数据量确定,常查找访问时用数组;当数据量不确定,并常用到插入和删除操作时考虑用链表。
8.讲讲python的内存、垃圾管理机制:引用计数(当计数为0时被清除)、标记清除、分代回收。引用计数是主要的内存管理机制。
9.python和c++的区别:python是解释性语言Cpp是编译语言。python是顺序执行的故而不能并行,cpp可以并行。cpp执行效率高。python有GIL锁,并不能实现真正意义上的并行计算。
10.迭代器和生成器有啥区别:生成器可以用来生成迭代器,生成器存储的是计算方式不是存的数据所以节约内存,迭代器是惰性计算即用一个算一个,所以我们不知道它到底有多少数据,而可迭代对象比如字典列表集合,它的数据量有多少我们是知道的。

二. 操作系统

1.进程、线程、协程的区别:进程是资源分配单位,一个进程可以包含多个线程,线程是cpu调度的单位,线程本身基本没有资源它是利用进程提供的资源,协程是微线程,一个进程或线程可以拥有多个协程。
2.多进程和多线程如何进行通信:多进程间通信有:管道(匿名pipe,有名FIFO特点简单)、信号量(系统开销小)、共享存储、本地套接字(稳定)。多线程间同信有:等待/唤醒,内存共享(主要的通信方式)。

三. 设计模式

1.面向对象和面向过程有啥优缺点:面向对象可以构建一个易扩展、灵活、高内聚低耦合、易维护的系统,缺点是其性能比面像过程低,因为它在实例化时资源消耗很大。在不同的场景下选择不同的方式,如果要求性能的话应当选择面像过程,比如在单片机、嵌入式中一般面像过程编码而不是面像对象编码。
2.自己实现一个单例模式:python中只需重写类中的__new__()方法即可,也就是先判断是否存在实例(利用类属性),如果存在则不建新实例即不调用object__new__(cls)。
3.

四. 其他

1.平常如何自学:在优质网站找优质资源,看书看视频学习,关注趋势看看github上的trending。
2.如何解决代码问题的:直接google、去StackOverflow、github issue区、社区等地方去搜索问题或者提问。
3.必有算法题。这里就不说了,leetcode上有。最长公共子串子序列,KMP算法,贪心算法,动态规划,数据结构。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值