美团后台开发暑期实习一面面经

美团后台开发暑期实习一面面经
最新回答
一页

2021-08-17 16:41:18

美团后台开发暑期实习一面面经总结如下

一、项目/科研经历相关问题
  • 遇到的困难需结合具体项目阐述技术难点,例如高并发场景下的性能瓶颈、分布式系统中的数据一致性挑战等。重点说明分析问题的过程(如通过日志排查、监控工具定位)及解决方案(如引入缓存、优化SQL、调整线程池参数)。

  • 拷打项目细节

    方案选择原因:需对比备选方案(如Redis与Memcached的选型、MySQL分库分表策略),说明当前方案在性能、成本、可维护性等方面的优势。

    备选方案列举:例如缓存策略可选本地缓存或分布式缓存,需分析适用场景。

    自我评分与改进:评分需客观(如7/10),改进点可提及代码复用性、异常处理完善性等。

  • 个人贡献与不足

    优点:突出技术深度(如优化数据库查询使响应时间降低40%)或协作能力(如推动团队采用自动化测试)。

    改进方向:可提及对新技术的学习不足(如未深入掌握分布式事务框架)、需求评审阶段考虑不周全等。

二、操作系统与网络基础
  • 进程调度算法需掌握以下算法及其适用场景:

    FCFS(先来先服务):公平但效率低,适合长作业。

    SJF(短作业优先):平均等待时间短,但可能导致饥饿。

    优先级调度:区分任务紧急程度,需防止低优先级任务长期阻塞。

    时间片轮转:实现多任务并发,时间片大小影响上下文切换开销。

    多级反馈队列:综合优先级与时间片,兼顾交互式与批处理任务。

  • 输入地址到返回网页的过程

    DNS解析:递归查询本地缓存、根域名服务器、顶级域名服务器,最终获取IP。

    TCP连接:通过三次握手建立可靠通道。

    HTTP请求:客户端发送请求头与数据,服务器处理后返回响应。

    渲染与返回:浏览器解析HTML/CSS/JS,渲染页面并关闭TCP连接(四次挥手)。

  • TCP三次握手原因

    为何不是两次:防止历史连接导致的资源浪费。若客户端发送的旧SYN包因网络延迟到达,服务器回复SYN+ACK后若无第三次握手,会错误建立连接。

    为何不是四次:三次已能同步双方初始序列号与确认号,额外握手无实际意义。

三、数据库设计与优化
  • 库表设计评估标准

    需求匹配度:是否覆盖所有业务场景(如订单表需包含用户ID、商品ID、状态等)。

    扩展性:是否支持未来功能迭代(如用户表预留扩展字段)。

    性能:通过索引优化查询效率(如为高频查询字段建索引)。

    规范化程度:遵循三大范式以减少冗余。

  • 数据库三大范式

    第一范式(1NF):字段不可再分(如地址拆分为省、市、区)。

    第二范式(2NF):非主键字段完全依赖主键(如订单明细表需包含订单ID与商品ID作为联合主键)。

    第三范式(3NF):非主键字段间无传递依赖(如用户表中的“所在城市”不应依赖“省份”字段)。

  • 索引设计原则

    选择性高:区分度大的字段(如用户ID优于性别)。

    高频查询:为WHERE、JOIN、ORDER BY涉及的字段建索引。

    避免过度索引:索引会占用存储空间并降低写入性能。

    复合索引顺序:遵循最左前缀原则(如索引(A,B)可优化A=1 AND B=2,但无法优化B=2)。

  • MySQL采用B+树的原因

    磁盘IO效率:B+树非叶子节点仅存键值,数据集中在叶子节点,减少IO次数。

    范围查询优化:叶子节点通过指针连接,支持高效的范围扫描(如ID BETWEEN 1 AND 100)。

    稳定性:树高度可控(通常3-4层可存储千万级数据),查询时间复杂度为O(log n)。

  • 事务隔离级别

    读未提交(Read Uncommitted):可能读到未提交数据(脏读)。

    读已提交(Read Committed):避免脏读,但可能不可重复读(同一事务内两次读取结果不同)。

    可重复读(Repeatable Read):避免脏读与不可重复读,但可能幻读(其他事务插入新数据)。

    串行化(Serializable):最高隔离级别,通过锁机制完全避免并发问题,但性能最低。

四、Java与框架基础
  • 垃圾回收算法

    标记-清除:标记无用对象后直接清除,产生内存碎片。

    复制算法:将存活对象复制到另一块内存,适合新生代(如Eden区)。

    标记-整理:标记后压缩内存,避免碎片化,适合老年代。

    分代收集:结合以上算法,新生代用复制,老年代用标记-整理。

  • Spring Bean生命周期

    实例化:通过反射创建Bean实例。

    属性注入:依赖注入(DI)完成属性赋值。

    初始化:调用@PostConstruct方法或实现InitializingBean接口。

    使用:Bean处于活跃状态,供业务逻辑调用。

    销毁:调用@PreDestroy方法或实现DisposableBean接口,释放资源。

五、编程题:字符串转IP地址
  • 题目要求:将形如"192.168.1.1"的字符串转换为32位整数(如3232235777)。
  • 解题思路

    按.分割字符串为4部分。

    验证每部分是否为0-255的整数。

    将每部分转换为8位二进制,拼接为32位整数。

  • 代码示例(Java)
public int ipToInt(String ip) { String[] parts = ip.split("."); if (parts.length != 4) return -1; int result = 0; for (int i = 0; i < 4; i++) { int num = Integer.parseInt(parts[i]); if (num < 0 || num > 255) return -1; result |= (num << (24 - 8 * i)); } return result;}

:更多笔面经可参考链接:

https://link.youzhiwk.com/r/vRkdSTx3HS