1. Go 语言参数传递是值传递还是引用传递
- Go 语言中所有的传参都是值传递,都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct 等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan 等这些),这样就可以修改原内容数据。
是否可以修改原内容数据,和传值、传引用没有必然的关系。在 C++ 中,传引用肯定是可以修改原内容数据的,在 Go 语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型。
这里要记住,引用类型和传引用是两个概念,引用类型不是传引用。
2. Python 语言参数传递是值传递还是引用传递
- Python 语言的参数传递既不是传值(pass-by-value),也不是传引用(pass-by-reference),而是对象的引用(pass-by-object-reference),即传递的是一个对象的内存地址。
Python 从设计之初就是一门面向对象的语言,它有一个重要的概念,即一切皆对象。数字、字符串、元组、列表、字典、函数、方法、类、模块等都是对象,包括你的代码。
3. Python 语言中可变对象和不可变对象
- 可变对象:list,dict
- 不可变对象:int,string,float,tuple
4. JavaScript 语言参数传递
- 值传递
5. Java 语言参数传递
- 值传递
6. C/C++ 语言参数传递
- 值传递、地址传递、引用传递
7. C++ 多态
- 静态多态(重载,模板):是在编译的时候,就确定调用函数的类型。
动态多态(覆盖,虚函数实现):在运行的时候,才确定调用的是哪个函数,动态绑定。运行基类指针指向派生类的对象,并调用派生类的函数。
虚函数实现原理:虚函数表和虚函数指针。
纯虚函数:virtual int fun() = 0;
8. C++ 成员函数被重载和覆盖的区别
- 重载的特征有:相同的范围(在同一个类中);函数名字相同;参数不同;virtual 关键字可有可无。
覆盖的特征有:不同的范围(分别位于派生类与基类);函数名字相同;参数相同;基类函数必须有 virtual 关键字。
9. C++ 容器
- 顺序容器:vector(动态数组)、list(双向链表)、deque(双向队列)。其中 vector 元素在内存中是连续存放的,支持随机存取,基于数组实现;list 元素在内存中是不连续的,不支持随机存取,基于链表实现。deque 与 vector 类似,但是对于首元素提供删除和插入的双向支持。
关联容器:map、set。map 是 key-value 形式的,set 是单值。map 和 set 只能存放唯一的 key 值,multimap 和 multiset 可以存放多个相同的key值。map 内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,map 中的元素是自动按 key 升序排序,所以不能对 map 用 sort 函数。
顺序的意思是元素的位置是顺序插入的,插入位置与元素的值无关,核心是容器没有排序。
关联的意思是元素是排序的。
容器类自动申请和释放内存,无需 new 和 delete 操作。
需要随机访问或存储元素的数目已知,用 vector
需要任意位置随机插入删除,用 list
经常在容器的首部尾部插入删除元素,用 deque
元素结构复杂用 list,也可以用 vector 存储指针(需要额外的精力去维护内存),看需求
如果操作是基于键值或需要经常的搜索,用 set/map
10. 二叉搜索树时间复杂度
- O(log(n))
11. 如果给你一个含 50亿无序的 QQ 号的文件,每个 QQ 号都是一个无符号整型,现在用户查找某个 QQ 号,如何快速判断这个 QQ 号是否存在?内存限制 4G。【相关题目】设计数据结构,使其能够快速返回 0~10亿 哪些数存在或者不存在;给你一个含有 1亿个 QQ 号码的文件,如何快速地查找某个 QQ 号码;给 40亿个不重复的无序的无符号整数,给定一个无符号整数,如何快速判断这个数是否存在于 40亿个数之中?
- Trie 树(字典树、单词查找树、键树)
12. TCP 和 UDP 的区别
- TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议
UDP(User Data Protocol,用户数据报协议)是面向非连接的协议
TCP | UDP | |
---|---|---|
可靠性 | 可靠 | 不可靠 |
连接性 | 面向连接 | 面向非连接 |
有序性 | 有序 | 无序 |
有界性 | 无界 | 有界 |
流量控制 | 有(滑动窗口) | 无 |
拥塞控制 | 有(慢开始、拥塞避免、快重传、快恢复) | 无 |
双工性 | 全双工 | 一对一、一对多、多对一、多对多 |
应用场合 | 对效率要求相对低,但对准确性要求相对高,或者要求有连接的场景 | 对效率要求相对高,但对准确性要求相对低的场景 |
速度 | 慢 | 快 |
效率 | 低 | 高 |
头部大小 | 大 | 小 |
应用层协议 | 应用 | 传输层协议 |
---|---|---|
SMTP | 电子邮件 | TCP |
TELNET | 远程终端接入 | TCP |
HTTP | 万维网 | TCP |
FTP | 文件传输 | TCP |
DNS | 名字转换 | UDP |
TFTP | 文件传输 | UDP |
DHCP | IP 地址配置 | UDP |
SNMP | 网络管理 | UDP |
NFS | 远程文件服务器 | UDP |
专用协议 | IP 电话 | UDP |
专用协议 | 流媒体通信 | UDP |
13. Linux 文件句柄数和最大进程数
- 在 Linux 服务器大并发调优时,往往需要预先调优 Linux 参数,其中就要修改 Linux 最大文件句柄数。
使用 ulimit -a,通过 open files (-n) 2048 和 max user processes (-u) 256324 分别查看文件句柄数和最大进程数,可以通过 vi /etc/security/limits.conf 或者 vi /etc/profile 修改
14. Go 语言中 new 和 make 的区别
- 二者都是内存的分配(堆上),make 只用于 slice、map 以及 channel 的初始化(非零值);而 new 用于类型的内存分配,并且内存置为零。make 返回的还是这三个引用类型本身;而 new 返回的是指向类型的指针。
15. Go 语言 select 语句
- 每个 case 必须是一个通道操作,要么发送要么接收;所有 channel 表达式都会被求值;所有被发送的表达式都会被求值;如果某个通道准备就绪,它就执行,其他的被跳过;如果有多个 case 都可以执行,则随机选一个执行,其他的被跳过;在所有的 case 都不能执行的情况下,如果有 default ,则执行该语句,否则 select 将阻塞,直到某个通道可以执行,不会重新对 channel 求值;
16. 哈希冲突解决
- 开放定址法:也称再散列法,主要有线性探测再散列、二次探测再散列、伪随机探测再散列
再哈希法:同时构造多个不同的哈希函数,双重散列,多重散列,缺点:计算时间增加
链地址法:也称拉链法,适用于经常进行插入和删除的情况,实际的哈希表实现中,使用最多
建立公共溢出区:基本思想是将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素一律填入溢出表
17. NP 问题
NP 完全问题(NP-C问题),是世界七大数学难题之一。 NP 的英文全称是 Non-deterministic Polynomial 的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。
- P 类问题:所有可以在多项式时间内求解的判定问题构成 P 类问题。判定问题:判断是否有一种能够解决某一类问题的能行算法的研究课题。
- NP 类问题:所有的非确定性多项式时间可解的判定问题构成 NP 类问题
- NP-C 问题:NP 中的某些问题的复杂性与整个类的复杂性相关联。这些问题中任何一个如果存在多项式时间的算法,那么所有 NP 问题都是多项式时间可解的。这些问题被称为 NP-完全问题。
网友评论