---
# System prepended metadata

title: 230915-秋招-美团-祝

---

# 美团秋招面试

岗位：服务端开发 一面挂

## 面试问题

- **vector放进一个对象元素过程**

  构造对象

  push_back拷贝构造

  emplace_back移动构造

  vector扩容

  五种构造函数：默认无参构造函数，拷贝构造函数，移动构造函数，拷贝赋值构造函数，移动赋值构造函数

- **操作系统进程 线程 协程 优缺点**

  操作系统中的进程、线程和协程是实现并发执行的重要概念，它们各自有不同的优缺点。

  1. 进程：
     优点：

     - 进程之间相互独立，一个进程的崩溃不会影响其他进程。
     - 进程可以利用多核处理器实现并行计算。
     - 进程拥有独立的地址空间，可以保护数据的安全性。

     缺点：

     - 进程切换开销较大，包括上下文切换、页表切换等，消耗更多的系统资源。
     - 进程间通信需要额外的机制，如管道、消息队列等，开销较大。

  2. 线程：
     优点：

     - 线程切换开销较小，比进程更轻量级。
     - 多个线程可以共享同一进程的资源，如内存、文件等，方便数据共享。
     - 线程可以充分利用多核处理器进行并行计算。

     缺点：

     - 多线程编程较为复杂，需要考虑同步、互斥等问题，容易出现竞态条件和死锁等问题。
     - 一个线程的崩溃可能导致整个进程的崩溃。

  3. 协程：
     优点：

     - 协程的切换开销非常小，使用用户态上下文切换，比线程更轻量级。
     - 协程可以在同一个线程中实现并发执行，无需依赖多线程或多进程。
     - 协程可以方便地实现异步编程和协作式多任务。

     缺点：

     - 协程通常只能在同一个线程中执行，无法利用多核处理器进行并行计算。
     - 协程需要遵循约定，显式的让出执行权，否则可能导致阻塞其他协程。

  总结：

  - 进程适合于需要隔离、保护数据的情况，但开销较大。
  - 线程适合于共享资源、需要利用多核处理器的情况，但需要注意同步和互斥问题。
  - 协程适合于高并发、异步编程和协作式多任务的情况，但无法利用多核处理器。

  在实际应用中，根据具体的需求和场景，可以选择适合的并发执行方式。

- **动态链接库和静态链接库的区别，什么是显示链接和隐式链接**

  动态链接库和静态链接库是两种常见的代码库形式，它们有以下区别：

  1. 静态链接库：
     - 在编译时将库的代码和可执行文件的代码合并成一个单独的可执行文件。
     - 执行时不需要外部的库文件支持，所有的代码都被复制到可执行文件中。
     - 可执行文件的体积较大，因为包含了库的全部代码。
     - 优点是程序的发布和部署相对简单，不依赖外部的库文件。

  2. 动态链接库：
     - 在编译时只将库的引用信息放入可执行文件中，实际的库代码在程序启动时由操作系统加载。
     - 执行时需要依赖外部的库文件，库文件可以被多个程序共享。
     - 可执行文件的体积较小，因为不包含库的全部代码。
     - 优点是节省存储空间，多个程序可以共享同一个库，库的更新和升级也比较方便。

  显示链接和隐式链接是两种链接库的方式：

  1. 显示链接：
     - 程序中使用的函数或符号在链接时必须显式地指定链接到哪个库。
     - 链接器会在编译时找到相应的库文件，并将其与可执行文件关联起来。
     - 显示链接需要在编译阶段进行配置，可以通过命令行参数或配置文件指定。

  2. 隐式链接：
     - 程序中使用的函数或符号在链接时不需要显式指定链接到哪个库。
     - 链接器会根据函数调用或符号引用自动查找和关联相应的库文件。
     - 隐式链接是通过编译器设置的默认规则实现的，开发人员无需手动操作。

  显示链接和隐式链接可以结合使用，根据实际需要选择合适的链接方式。一般来说，静态链接库适合于独立发布的程序，而动态链接库适合于共享的库或需要灵活升级的情况。

  [参考](https://www.cnblogs.com/Survivalist/p/11527949.html)

- **get 和 post 请求区别**

  GET请求和POST请求是HTTP协议中常用的两种请求方法，它们在以下几个方面有一些区别：

  1. 数据位置：
     - GET请求将数据放在URL的查询参数中，通过使用`?`和`&`来连接参数键值对，例如：`http://example.com/path?key1=value1&key2=value2`。
     - POST请求将数据放在请求体中，而不是URL中，数据以键值对的形式传输。
  2. 数据长度限制：
     - GET请求的数据长度有限制，通常受限于浏览器或服务器的设置。这是由于GET请求中的参数直接暴露在URL中，过长的URL可能导致被截断或无法处理。
     - POST请求的数据长度没有严格的限制，可以传输较大的数据量。
  3. 安全性：
     - GET请求的数据参数在URL中明文显示，因此不适合传输敏感信息，如密码等。GET请求的数据容易被缓存、历史记录或日志文件记录。
     - POST请求的数据在请求体中，并不会明文显示在URL中，相对更安全。POST请求适合传输敏感信息。
  4. 请求语义：
     - GET请求是幂等的，即多次发送相同的GET请求，对服务器的数据不会产生影响。
     - POST请求不是幂等的，多次发送相同的POST请求可能会导致服务器上的数据状态发生变化。
  5. 缓存：
     - GET请求可以被浏览器缓存，响应结果可以被缓存下来，下次请求相同的URL时可以直接使用缓存的结果，减少服务器的压力。
     - POST请求一般不会被浏览器缓存，每次请求都会向服务器发送请求并获取最新的响应。

  综上所述，GET请求适合用于获取数据，而POST请求适合用于提交或修改数据。根据实际需求和安全性考虑，选择合适的请求方法。

- **select d from i where a in () and b in () and c in () ，走下面那个索引(a,b) (b,c) (c,d)**

  (a,b) (b,c) (c,d)为联合索引，指的是在数据表两个列上创建的索引，可以提高对这些列的查询性能。

  最佳左前缀法，如果索引了多列，要遵守最左前缀法则，否则索引失效

  按最左前缀原则，a和b走(a,b)，然后c走索引(c,d)

  [联合索引](https://cloud.tencent.com/developer/article/1797382)

## 智力题

- **20 个硬币，有一个假的硬币，假币更重，天平秤称出假的硬币要多少次**

  第一次称：20个硬币分成三份，7，7，6，将两堆为7的放到天平上称，如果不平衡，则假币在重的7个中，否则假币在6个的一堆中。

  第二次称：如果是7个的一堆，则分成3，3，1，将两堆为3的放到天平上，如果不平衡，则假币在重的3个的堆中，否则在剩下的一个中。如果是6个的一堆，则分成两个大小为3的堆，放到天平两边，则假币在重的3个的堆中。

  第三次称：将3个一堆分成1，1，1，任取两堆放到天平上，则必然可以称出假币。

  所以答案为最少3次。

  一次天枰称量能够得到左倾、右倾、平衡3种情况，如果把一次称量当做是一次编码，则它是3进制编码才能够表示；我们想要用3进制编码表示的是：12枚硬币，假设假币的轻重未知。每枚硬币都可能是假币，共12种情况，假币有可能比真币轻，也有可能重，共12*2=24种情况；3n>=24 则n至少为3才可以。所以从信息论的角度讲，3次称量是最小值。

- **4 瓶药很多片，其中有一瓶假药，真药每片 1.0g，假药每片 1.1g，给一个电子秤，如何一次就称出假药**

  可以按照以下步骤使用电子秤一次就称出假药：

  1. 将编号为1的瓶子取出1片药，编号为2的瓶子取出2片药，编号为3的瓶子取出3片药，编号为4的瓶子取出4片药。
  2. 将这些药片一起放在电子秤上进行称重。

  假设所有的药片都是真药，那么总重量应该是： (1 x 1.0g) + (2 x 1.0g) + (3 x 1.0g) + (4 x 1.0g) = 10.0g

  由于假药每片重量比真药多0.1g，如果称出的总重量超过10.4g，那么可以确定编号为4的瓶子中的药是假药。因为编号为4的瓶子中的药片数是4，而其他瓶子的药片数分别为1、2、3，因此多出的重量必定是来自编号为4的瓶子中的假药。

