面试真题 | 美团校招面经

@[toc]

一面

TCP和UDP的区别?

以下是TCP和UDP之间几个关键的区别:

  1. 连接与无连接

    • TCP(传输控制协议)是面向连接的协议。在数据交换之前,TCP需要在通信双方之间建立一个连接。这个连接过程包括三次握手,确保双方都已准备好接收数据。
    • UDP(用户数据报协议)是无连接的协议。UDP发送数据之前不需要建立连接,因此它是面向事务的简单不可靠信息传送服务。
  2. 可靠性

    • TCP提供了可靠的数据传输服务。它通过序列号、确认应答、超时重传、流量控制、拥塞控制等机制确保数据的完整性和顺序性。
    • UDP则不保证数据传输的可靠性。如果因为网络问题导致数据丢失或损坏,UDP不会进行任何恢复操作,它仅仅是将数据报尽最大努力交付给接收方。
  3. 头部开销

    • TCP的头部较大(通常20字节,可选字段会增加其大小),包含了序列号、确认号、窗口大小等控制信息,这些信息用于确保数据的可靠传输。
    • UDP的头部较小(只有8字节),只包含必要的端口号、长度和校验和等信息,因此UDP的传输效率更高,但牺牲了可靠性。
  4. 应用场景

    • TCP适用于需要可靠传输的应用场景,如文件传输(FTP)、网页浏览(HTTP)、电子邮件(SMTP)等。
    • UDP适用于对实时性要求较高,但可以容忍少量数据丢失的应用场景,如视频流、实时音频传输(VoIP)、DNS查询等。
  5. 流量控制和拥塞控制

    • TCP通过滑动窗口协议进行流量控制,防止发送方发送数据过快导致接收方处理不过来。同时,TCP还通过慢启动、拥塞避免、快重传、快恢复等算法进行拥塞控制,避免网络拥塞。
    • UDP不提供流量控制和拥塞控制机制,它假设网络状况良好,数据传输的可靠性由应用层来保障。

I/O复用解决什么问题?为什么使用I/O复用?

这个问题考的是对网络编程中资源管理、效率提升以及并发处理的理解。

I/O复用解决什么问题?

I/O复用主要解决的是在高并发网络编程中,单个进程或线程同时处理多个网络连接时的效率问题。在传统的网络编程模型中,如果服务器需要同时监听多个socket,它可能会为每个socket创建一个新的进程或线程。然而,这种方法在连接数增多时会带来显著的资源消耗(如内存和CPU),导致系统性能下降,甚至崩溃。

I/O复用技术允许单个进程或线程同时监听多个文件描述符(socket),并能够在这些文件描述符中的任何一个准备好I/O操作(如读、写)时得到通知。这样,进程或线程就可以非阻塞地等待多个I/O操作,从而提高了资源利用率和程序的吞吐量。

为什么使用I/O复用?

  1. 提高资源利用率:通过复用单个进程或线程来处理多个I/O操作,减少了系统资源的消耗(如创建和销毁进程/线程的开销)。

  2. 提升系统吞吐量:由于减少了因等待I/O操作而阻塞的进程/线程数量,系统能够同时处理更多的网络连接,从而提高了整体的吞吐量。

  3. 简化编程模型:I/O复用使得开发者能够编写出更简洁、更易于维护的代码,因为不再需要为每个连接单独创建一个进程或线程。

  4. 更好的可伸缩性:随着网络连接的增加,传统的多进程/多线程模型可能会遇到资源瓶颈。而I/O复用模型则能够更好地适应高并发场景,具有更好的可伸缩性。

  5. 支持异步I/O:虽然I/O复用本身并不直接等同于异步I/O,但它为实现异步I/O提供了基础。通过使用非阻塞I/O和事件通知机制,开发者可以构建出高效的异步I/O系统。

常见的I/O复用技术

  • select:是最早的I/O复用技术之一,但它有一些限制,比如单个进程能够监视的文件描述符的数量有限(通常在1024个左右),并且当文件描述符数量很大时,效率较低。

  • poll:是select的改进版本,它不受文件描述符数量的限制,但在处理大量文件描述符时效率仍然不高。

  • epoll(Linux特有):是select和poll的进一步增强,它提供了更高的效率和更好的可伸缩性。epoll使用基于事件的通知机制,当文件描述符就绪时,它会通知进程进行处理,而不是让进程不断地轮询检查。这使得epoll在处理大量并发连接时具有非常出色的性能。

问项目中CPP语法问题?

项目中算法?

项目问题。

  • 你写在简历上的项目一定要事无巨细,搞清楚哦。

二面 一周后 (1h)

进行自我介绍

详细讲下对你提高很大的项目?

有逻辑,金字塔原理。

哪个项目?

为什么?

是因为让你学到了什么?

升华一下!

写一下类的拷贝构造

在C++中,拷贝构造函数是一个特殊的构造函数,它用于创建一个新对象作为另一个同类型对象的副本。拷贝构造函数在以下几种情况下被自动调用:

  1. 当通过值传递对象给函数时。
  2. 当从一个对象初始化另一个同类型的对象时(使用等号=)。
  3. 当函数返回对象时(包括临时对象)。

拷贝构造函数的声明通常如下:

class ClassName {
public:
    // 默认构造函数
    ClassName() {
        // 初始化代码
    }

    // 拷贝构造函数
    ClassName(const ClassName& other) {
        // 拷贝other到当前对象
    }

    // 其他成员函数...
};

这里是一个简单的例子,演示了如何为一个包含动态分配内存的类编写拷贝构造函数:

#include <iostream>
using namespace std;

class String {
private:
    char* data;

public:
    // 默认构造函数
    String(const char* str = "") {
        if (str) {
            data = new char[strlen(str) + 1];
            strcpy(data, str);
        } else {
            data = new char[1];
            *data = '\0';
        }
    }

    // 拷贝构造函数
    String(const String& other) {
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
    }

    // 析构函数
    ~String() {
        delete[] data;
    }

    // 输出字符串
    void print() const {
        cout << data << endl;
    }

    // 其他成员函数...
};

int main() {
    String s1("Hello");
    String s2 = s1; // 调用拷贝构造函数

    s1.print(); // 输出: Hello
    s2.print(); // 输出: Hello

    return 0;
}

在这个例子中,String类包含了一个指向字符数组的指针data,用于存储字符串。拷贝构造函数String(const String& other)接收一个对同类型对象的常量引用作为参数,并使用strlenstrcpy函数来复制other对象的字符串到当前对象的data指针所指向的内存中。注意,这里使用了new来分配内存,因此必须在析构函数中使用delete[]来释放内存,以避免内存泄漏。

记住,如果你没有为你的类提供拷贝构造函数,编译器会为你生成一个默认的拷贝构造函数,该构造函数会进行浅拷贝(shallow copy)。然而,在包含动态分配内存或资源管理(如文件句柄、网络连接等)的类中,浅拷贝通常是不安全的,因为它会导致多个对象共享相同的资源,并在析构时多次释放这些资源,从而引发错误。因此,在这些情况下,你需要自己编写一个拷贝构造函数来执行深拷贝(deep copy)。

虚函数的构造,能否有delete函数,构造函数能否有虚函数?

在C++中,关于虚函数、构造函数和delete函数(这里我假设你指的是析构函数,因为C++标准中并没有直接称为delete的函数,但析构函数在对象销毁时自动调用,其效果类似于"删除"对象)有一些重要的规则和限制。

虚析构函数

可以有虚析构函数。虚析构函数主要用于在通过基类指针删除派生类对象时,确保能够正确地调用派生类的析构函数,以避免资源泄漏或未定义行为。当基类指针指向派生类对象,且你希望通过该基类指针删除该对象时,必须在基类中声明虚析构函数。

class Base {
public:
    virtual ~Base() {} // 虚析构函数
};

class Derived : public Base {
    // ...
};

Base* ptr = new Derived();
delete ptr; // 正确调用Derived的析构函数

构造函数不能是虚函数

构造函数不能是虚函数。这是因为构造函数是在对象创建时调用的,而虚函数的机制依赖于对象的vptr(虚函数表指针),该指针在对象构造期间还未被初始化。因此,在构造函数调用时,编译器无法确定应该调用哪个类的构造函数。此外,构造函数的目的就是初始化对象,此时对象的具体类型(基类还是派生类)是已知的,因此不需要虚函数机制来确定调用哪个构造函数。

是否有“dele

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

ARM/Linux嵌入式真题 文章被收录于专栏

让实战与真题助你offer满天飞!!! 每周更新!!! 励志做最全ARM/Linux嵌入式面试必考必会的题库。 励志讲清每一个知识点,找到每个问题最好的答案。 让你学懂,掌握,融会贯通。 因为技术知识工作中也会用到,所以踏实学习哦!!!

全部评论

相关推荐

2025-11-26 11:21
已编辑
武汉理工大学 Java
个人bg:&nbsp;211本,一段京东实习,一段xhs实习,一段小厂实习。互联网只有美团一个带薪意向。转正失败情况:京东实习了四个月,感觉收获比较少,做的事情偏基础,第三个月底答辩,离职后两个月被告知转正失败。对此我只能说,零售卡硕。xhs实习两个月,反而感觉收获更多,被安排了有挑战的事情,大模型在业务场景中的运用,最后一个星期通知有转正机会,边做需求边匆忙准备,答辩采取一票否决制,四个领导三过一否,也失败。(早知道xhs今年开这么高我就熬夜赶材料了)不过在这个过程中,也push自己了解了一定rag&nbsp;mcp&nbsp;大模型的相关知识,对于后续面阿里和美团很有帮助。个人基础情况:hot100能默写。去年12底学完jvm&nbsp;juc。2月入职京东前小林coding&nbsp;guide就差不多看完了。后面实习的时候也有继续补面筋,场景题。秋招情况:8月初就投了,也不晚。滴滴:&nbsp;笔试a了没面,可能投的岗位太小众了?(抱着拿了也不去&nbsp;用于a价的想法)一直卡着。携程:&nbsp;不发笔。发官方邮件也不回。京东:笔试挂了。嗯,很耻辱,那天在外面玩但确实很久没复习笔试考试范围了,全忘光了。腾讯:从来没约过,可能暑期面了十几次面太多了。阿里控股:一面挂。阿里国际:hr面后一个月挂。字节:国际电商三面挂-&gt;星图一面挂(面的时候已经有很多候选人了)-&gt;&nbsp;安全风控二面挂(业务不是很好,面试过程说漏嘴说业务会影响我选择,场景题没答好)-&gt;&nbsp;中台一面后无消息快手:二面挂。xhs:hr面后无消息,排序应该很靠后。虾皮:hr面两个月无消息,应该还在泡池子。百度:一面挂。pdd:笔试a3后笔试挂。难绷。个人反思总结:for&nbsp;后来者。1.&nbsp;笔试一定要把握好,虽然面试中都是hot100,有些甚至不考面试题,但是大厂笔试题是有acm难度的,挂了就是挂了,很多没有第二次机会,约面也没机会了。建议时间充裕情况下,还是要把灵神的题单多刷点。顺序可以参考:代码随想录视频+题&nbsp;-&gt;&nbsp;灵神视频+题&nbsp;-&gt;hot100&nbsp;-&gt;灵神题单(可以每个part挑难度低的前几道写)2.&nbsp;一段深入长的实习经历一定是大于两段短的,不过现在再让我选到底是继续在jd还是去xhs我还是选不出来。在面试的过程中,有些面试官也会认为我实习的太浅,没有做什么有深度的事情,对多种方案的调研不全面。如果实习做的事情比较有挑战最好,如果没有,也要尽量往多种方案调研最后选择了哪个方案,达到了当初定的业务指标/技术指标方面包装。3.&nbsp;还是得早投。身边除了bg特别好的朋友,投的晚的无一例外秋招情况会差很多。8月前投能赶上提前批。最晚不要8月中旬过了还没投完。有投的早的没有实习的朋友秋招结果也可以。没有面试的同学一定要尝试官网,boss直聘多种途径投。4.&nbsp;对于有实习的同学,基础没有那么重要了,更多还是专注于对实习的考察,可以以金字塔的形式进行论述,避免在最开始的时候就展开大量细节。如果实在没有实习,bg够硬,投的够早也会有面,只需要一个比较深入的项目应该就没问题,把项目当作自己在实习要投入生产的心态去调研包装。5.&nbsp;有的时候真的看运气。即使是同一个部门甚至是同一个组的同学,做的事情也会有差异,这主要看导师被分配到什么样的活。for&nbsp;me:大二的时候绩点排名前10%,但还是决定放弃保研,开始学java,这一路走来,经历迷茫踏实的反复,也想和自己说句幸苦了,谁想得到当初给自己定的目标是有份工作不饿死就行。可能差点运气,可能在关键节点上做的还是不够,对于实习的包装,对于面试表现还是差点。会后悔自己没读研吗?其实我也有考雅思,申请了港大计算机,但估计大概率还是工作(实则也没港大offer)。人不能既要又要还要,我不能既要早点工作赚钱,实现我财富自由支配,带不舍得花钱的家人去旅游的想法,又要长期来看高学历晋升的优势,还要在大环境变差一届比一届卷我也能找到差强人意的工作。所以,至少现在,我不后悔。如果我更倾向于国企而不是互联网,比起技术挑战更偏爱稳定的生活我大概率会读研。如果我本科没有211,我还想进大厂,我也大概率会读研。会后悔自己没选其他的方向吗?java确实相对卷一点,但也只是相对的,因为其他方向的人也很多,并不是换方向就一定会更好。计算机这一行本就短命,能干到35就算成功,大家都是为了赚钱,基于此,在背景没那么硬时,选择一个相对人少的方向进大厂是对的。看自己怎么理解了。最好的还是参考直系学长学姐的选择,一定要多沟通交流。一些安慰自己的话,秋招是人生的起点,不一定是高费阵容才能吃鸡,低费阵容早点发育也有吃鸡的上限。(随便乱说的)。最后还想再写一段话给学妹们,程序员这一行,女生确实会相对少一点,但比起传统工科非常直接的偏向男生,计算机这一行认为菜是原罪,性别的因素会少很多,更多看个人技术和水平。在京东实习的时候,我的小组长在我进去第一天就和我说,我们部门女生虽然少,但是水平都至少是中上的,都很能吃苦很能干。无论是我们组干活巨快的A姐,还是总能很快解答我问题的B姐,又或者是其他总能给我提供建议的其他姐姐们,都使我对这一点坚信不疑,她们高学历,专业,细心,耐心。如果你也热爱技术,虽然有时会被bug折磨,但喜欢学到知识时候的踏实,喜欢bug&nbsp;fix的爽感,你就是适合这一行的。我的秋招结束了,但我大概率不会甘心,还是会想试试春招,但我也真的觉得到现在这一步已经很棒了。欢迎同校学妹学弟们找我沟通交流~
疲倦的牛马还在上班:再冲一次,春招不留遗憾吧!
我的秋招日记
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务