腾讯C++研发岗

122 阅读13分钟

题目

(1)、实现一个循环队列。

(2)、STL的unordered_map和map的区别

(3)、C和C++的特点与区别

(4)、C++的多态

(5)、虚函数的实现

(6)、C++内存分配

(7)、几大存储区

(8)、Python的特点

(9)、Python有哪些实现

(10)、CPython的解释执行过程

(11)、Python里面垃圾回收是怎样的

(12)、Python多线程介绍

(13)、多线程可以使用多核吗

(14)、协程的了解

(15)、cgi的了解

(16)、http协议get和post的区别

(17)、进程间通信方式

(18)、建立TCP服务器的各个系统调用

(19)、处理多个套接字的I/O复用介绍

(20)、epoll为什么更快

(21)、虚拟内存的概念与介绍

(22)、单链表的倒置

(23)、红黑树的了解与其查找复杂度 (24)、快速排序的优化

(25)、字符串匹配算法

(26)、TCP的三次握手与四次挥手的详细介绍

(27)、TCP的超时等待的介绍

(28)、流量控制的介绍

(29)、数字证书的了解

(30)、http和https的区别

(31)、对数据库包括其引擎的区别与了解

(32)、数据库索引的作用

(33)、C++内存模型

(34)、程序编译链接的过程和函数找不到在哪个阶段报错

(35)、线程间通信

(36)、游戏中打怪时已经各个小怪的坐标,你放一个技能是圆形范围,快速求能打到的小怪

(37)、无锁编程解决单生产者多消费者问题和多生产者多消费者问题

(38)、魔兽世界10人房间,现在组队规模有3人,有5人,如何让每个人等待的时间尽可能少,即将时间线上哪些队伍组合在一起开始一个游戏

(39)、快速排序的稳定化算法

(40)、隔一个删除一个map中的元素

(41)、文件系统

(42)、进程线程区别

(43)、详细说明管道、共享内存、信号量

(44)、在共享内存中如何使用mutex

(45)、1G共享内存,切割为很多记录,每个大小1K,多个进程访问,如何对每个记录进程保护

(46)、select和epoll实现区别

(47)、nginx和apache对比

(48)、ACID

(49)、数据库引擎

(50)、访问一个web页面的流程

(51)、有哪些地方可以做分流

(52)、100万个ip,找出最多的100个

(53)、c++的static关键字的作用

(54)、内联函数跟普通函数区别

(55)、STL中的迭代器失效问题

(56)、指针,引用区别

(57)、Linux相关cpu内存网络相关指令

(58)、父子进程fork时,打开的文件的偏移量是否是相同的

(59)、Linux虚拟地址空间

(60)、vector跟list区别,还有map的底层实现

(61)、extern关键字

(62)、一个数组传递到函数,蜕变成指针,求字节数

(63)、定义在全局的对象,定义在堆中对象,定义在静态局部变量对象,定义在栈中的对象,析构函数的析构顺序

(64)、new int[10]跟new int10区别

(65)、求二叉树的翻转

(66)、编写c语言程序判断该大小端

(67)、linux内核解决惊群问题

(68)、hash碰撞,Trie树

答案

  1. 实现一个循环队列。
    循环队列可以通过数组和两个指针(头和尾)实现。当队列满时,尾指针回到数组起点,头指针移动到下一个位置。这样可以避免队列中间的空洞。

  2. STL的unordered_map和map的区别
    unordered_map基于哈希表实现,提供平均常数时间复杂度的访问;map基于红黑树,提供对数时间复杂度的访问,且元素有序。

  3. C和C++的特点与区别
    C++增加了面向对象的特性,如类和继承,支持多态和异常处理。C是过程式语言,结构化编程。

  4. C++的多态
    多态允许不同类的对象对同一消息做出响应。通过虚函数和继承实现,基类指针可以指向派生类对象。

  5. 虚函数的实现
    虚函数通过虚函数表(vtable)实现,对象包含指向vtable的指针,运行时根据vtable调用正确的函数。

  6. C++内存分配
    使用newdelete操作符进行动态内存分配和释放,避免内存泄漏。

  7. 几大存储区
    程序的存储区包括代码区、静态数据区、堆和栈。堆用于动态内存分配,栈用于局部变量和函数调用。

  8. Python的特点
    Python是一种高级编程语言,支持多种编程范式,具有丰富的标准库和社区支持。

  9. Python有哪些实现
    常见的Python实现有CPython(官方实现)、PyPy(Python的Python实现)、Jython(Java平台上的Python)等。

  10. CPython的解释执行过程
    CPython通过解释器逐行执行源代码,或将源代码编译成字节码再执行。

  11. Python里面垃圾回收是怎样的
    Python使用引用计数和分代垃圾回收机制管理内存,自动回收不再使用的对象。

  12. Python多线程介绍
    Python的threading模块支持多线程编程,但全局解释器锁(GIL)限制了多线程的并行执行。

  13. 多线程可以使用多核吗
    多线程可以在多核处理器上并行执行,但Python的GIL限制了同一时间只有一个线程执行。

  14. 协程的了解
    协程是程序组件,允许挂起和恢复执行,用于实现协作式多任务处理。

  15. cgi的了解
    CGI(Common Gateway Interface)是Web服务器与外部程序交互的标准。

  16. http协议get和post的区别
    GET用于请求数据,参数在URL中;POST用于提交数据,参数在请求体中。

  17. 进程间通信方式
    进程间通信(IPC)包括管道、消息队列、共享内存、信号和套接字等。

  18. 建立TCP服务器的各个系统调用
    建立TCP服务器涉及socket创建、bind、listen、accept和send/recv等系统调用。

  19. 处理多个套接字的I/O复用介绍
    I/O复用技术如select、poll和epoll允许单线程或进程管理多个套接字。

  20. epoll为什么更快
    epoll是Linux下高效的I/O复用机制,通过事件通知和非阻塞I/O提高性能。

  21. 虚拟内存的概念与介绍
    虚拟内存是操作系统技术,将物理内存扩展到硬盘空间,支持内存管理、数据共享和保护。

  22. 单链表的倒置
    单链表倒置可以通过改变每个节点的指向,使其指向前一个节点来实现。

  23. 红黑树的了解与其查找复杂度
    红黑树是一种自平衡二叉搜索树,查找、插入和删除操作的时间复杂度为O(log n)。

  24. 快速排序的优化
    快速排序优化包括选择更好的基准、尾递归优化、小数组使用插入排序等。

  25. 字符串匹配算法
    字符串匹配算法包括KMP、Boyer-Moore和Rabin-Karp等,用于在文本中查找模式串。

  26. TCP的三次握手与四次挥手的详细介绍
    TCP三次握手建立连接,四次挥手终止连接,确保数据传输的可靠性。

  27. TCP的超时等待的介绍
    TCP超时等待是连接关闭后,等待一段时间确保所有数据传输完成的状态。

  28. 流量控制的介绍
    流量控制是TCP特性,通过滑动窗口机制调整发送速率,防止接收方溢出。

  29. 数字证书的了解
    数字证书用于验证网络实体身份,加密和签名消息,确保通信安全。

  30. http和https的区别
    HTTPS在HTTP基础上增加了SSL/TLS加密,提供安全的网络通信。

    1. 对数据库包括其引擎的区别与了解
      数据库是存储、检索和管理系统,数据库引擎是其核心组件,负责数据存储、查询优化等。不同引擎如InnoDB(MySQL)、B树莓莓(PostgreSQL)有各自特点,如事务处理、锁机制等。
  31. 数据库索引的作用
    数据库索引加速数据检索,通过在数据结构(如B树)提供快速查找,但增加写操作开销。

  32. C++内存模型
    C++内存模型定义多线程程序中内存访问规则,包括内存可见性、原子性和顺序一致性。

  33. 程序编译链接的过程和函数找不到在哪个阶段报错
    编译将源代码转换为机器码,链接合并目标文件生成可执行文件。函数找不到通常在链接阶段报错。

  34. 线程间通信
    线程通信通过共享内存、互斥锁、条件变量等机制实现同步和数据交换。

  35. 游戏中打怪时已经各个小怪的坐标,你放一个技能是圆形范围,快速求能打到的小怪
    通过计算圆形区域内的小怪坐标,可以使用空间分割或几何算法快速查找。

  36. 无锁编程解决单生产者多消费者问题和多生产者多消费者问题
    无锁编程利用原子操作避免锁,通过CAS(比较并交换)实现线程安全的数据结构。

  37. 魔兽世界10人房间,现在组队规模有3人,有5人,如何让每个人等待的时间尽可能少
    优化匹配算法,如使用最小堆维护等待时间和队伍规模,动态调整队伍组合。

  38. 快速排序的稳定化算法
    稳定化快速排序通过路径压缩或三数取中值减少相等元素的顺序变动,保持稳定性。

  39. 隔一个删除一个map中的元素
    遍历map并删除索引为奇数的元素,注意迭代器失效问题。

  40. 文件系统
    文件系统是操作系统用于有效存储和检索文件数据的系统,支持文件和目录的组织、访问和保护。

  41. 进程线程区别
    进程是资源分配的基本单位,线程是CPU调度的基本单位。一个进程可包含多个线程。

  42. 详细说明管道、共享内存、信号量
    管道用于进程间通信,共享内存提供一块能被多个进程访问的内存区域,信号量用于线程间的同步。

  43. 在共享内存中如何使用mutex
    在共享内存区域使用互斥锁(mutex)保护数据访问,防止竞态条件。

  44. 1G共享内存,切割为很多记录,每个大小1K,多个进程访问,如何对每个记录进程保护
    使用互斥锁或读写锁保护共享内存记录,确保同时只有一个进程能修改记录。

  45. select和epoll实现区别
    select基于位图扫描,适用于少量文件描述符;epoll基于事件通知,效率高,适用于大量并发连接。

  46. nginx和apache对比
    nginx高性能、事件驱动,适合静态内容和反向代理;Apache功能丰富,模块化,适合动态内容。

  47. ACID
    ACID是数据库事务的四个特性:原子性、一致性、隔离性、持久性。

  48. 数据库引擎
    数据库引擎是数据库管理系统的核心组件,负责数据存储、检索和事务管理。

  49. 访问一个web页面的流程
    浏览器发送HTTP请求到服务器,服务器处理请求并返回响应,浏览器渲染页面。

  50. 有哪些地方可以做分流
    分流可以在负载均衡器、DNS、CDN等层面实现,通过分散流量提高系统可用性。

  51. 100万个ip,找出最多的100个
    使用哈希表或布隆过滤器统计和筛选出现频率最高的IP地址。

  52. c+++的static关键字的作用
    static用于限制变量或函数的作用域,或在类中表示静态成员,属于类而非实例。

  53. 内联函数跟普通函数区别
    内联函数在编译时展开,减少函数调用开销;普通函数在运行时调用。

  54. STL中的迭代器失效问题
    迭代器失效通常发生在容器大小改变时,如插入、删除元素,需要重新获取迭代器。

  55. 指针,引用区别
    指针是变量的地址,可变;引用是别名,不可变,必须初始化。

  56. Linux相关cpu内存网络相关指令
    topfreeifconfignetstat等,用于监控系统资源和网络状态。

  57. 父子进程fork时,打开的文件的偏移量是否是相同的
    是的,fork创建的子进程继承父进程的文件描述符和偏移量。

  58. Linux虚拟地址空间
    Linux虚拟地址空间为每个进程提供独立的地址空间,通过页表映射到物理内存。

  59. vector跟list区别,还有map的底层实现
    vector动态数组,支持随机访问;list双向链表,适合频繁插入删除。map通常红黑树实现。

  60. extern关键字
    extern声明变量或函数在另一个文件或库中定义,允许跨文件访问。

  61. 一个数组传递到函数,蜕变成指针,求字节数
    数组传递给函数时退化为指针,字节数取决于数组元素类型和数量。

  62. 定义在全局的对象,定义在堆中对象,定义在静态局部变量对象,定义在栈中的对象,析构函数的析构顺序
    析构顺序与构造顺序相反:栈中对象、静态对象、堆中对象、全局对象。

  63. new int[10]跟new int10区别
    new int[10]分配10个int未初始化;new int10调用默认构造函数初始化。

  64. 求二叉树的翻转
    递归或迭代交换二叉树左右子树实现翻转。

  65. 编写c语言程序判断该大小端
    通过联合体和指针访问内存,判断字节序。

  66. linux内核解决惊群问题
    使用锁机制或优化线程唤醒策略减少惊群效应。

  67. hash碰撞,Trie树
    hash碰撞通过链地址法解决;Trie树(前缀树)用于字符串快速检索。