美文网首页
面试题(一)

面试题(一)

作者: 萧何爱英语 | 来源:发表于2018-07-16 12:30 被阅读0次

    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-完全问题。

    相关文章

      网友评论

          本文标题:面试题(一)

          本文链接:https://www.haomeiwen.com/subject/qodupftx.html