腾讯云智实习面经(带答案)

1)手撕:给定字符串,求不含重复字符的最长子串长度,并打印这个子串
//哈希Set配合双指针
private static String findLongestSubstring(String s) {
        int n = s.length();
        int left = 0;
        int maxLength = 0;
        String longestSubstring = "";
        Set<Character> charSet = new HashSet<>();

        for(int right = 0 ; right < n ; right ++){
            while(charSet.contains(s.charAt(right))){
                charSet.remove(s.charAt(left));
                left++;
            }
            charSet.add(s.charAt(right));

            if(maxLength < right - left + 1){
                maxLength = right - left + 1;
                longestSubstring = s.substring(left , right + 1);
            }
        }
        return longestSubstring;
    }

2)如何设计一个秒杀系统?
从以下角度考虑:
1.高性能架构;采用分布式架构,消息队列来削峰填谷,服务的降级和熔断
2.高并发的处理能力:商品库存扣减的多线程安全问题,采用redisson分布式锁,缓存预热
3.用户体验升级:websocket实现秒杀倒计时同步,消息队列实现秒杀结果实时反馈,针对ip地址,设备指纹和访问频率的限制实现防作弊系统
4.数据一致性保障;数据库分库分表,本地消息表
5.监控报警:监控系统,报警系统,日志系统,异常日志收集,分布式追踪系统
6.安全防护、成本控制

3)String StringBuffer StringBuilder区别
String是不可变类,线程安全,每次修改字符串都会创建新的字符串,效率比较低
StringBuffer是可变类,直接在原字符串上修改,使用了Synchronized实现同步,效率也比较低,适合多线程场景
StringBuilder是可变类,线程不安全,效率比较高,适合单线程场景

4)数据库字段char和varchar区别
char:定长字符串,存储长度为1~255个字符,存储空间固定为255字节,不足用空格补,适合固定长度的字段,便于数据库读取和优化
varchar:可变字符串,存储长度为1~65535个字符,存储空间为实际长度+长度字节

5)索引失效的情况
索引失效是指数据库在查询过程中无法有效利用已建立的索引,导致查询性能下降,甚至退化为全表扫描的情况。
查询条件中使用了函数或表达式对索引列进行操作;
使用了OR条件且未对所有分支列建立索
查询条件中使用了NOT、<>、!=等否定操作符;
对索引列进行了模糊查询(如LIKE '%abc%'),且通配符位于开头;
查询条件中列的顺序与复合索引的列顺序不匹配;
或者查询时数据类型不匹配导致索引无法使用。

6)数据库的事务隔离级别
读未提交:允许读取尚未提交的数据,可能导致脏读、幻读、不可重复读
读已提交:允许读取已提交的数据,不能保证数据一致,可能导致幻读和不可重复读
可重复读:允许读取已提交数据,可能导致幻读
串行化:保证数据一致性,但是并发度和性能低

7)Redis的常用数据类型,分别存储哪些东西?
String:存储字符串,比如用户名、密码和验证码等
哈希:哈希表,可以存储用户信息,商品信息等
List:存储有序的元素,比如消息队列和日志记录
Set:集合,可以做去重排序或求交集等
Zset:带得分排序的集合,可以做用户或者流量等的排行榜

8)Redis的锁机制
基于SETNX命令,将锁名称作为键,客户端唯一标识(UUID)作为键值,使用完锁后DEL释放锁
    因不可冲入可能存在死锁和不及时释放锁的情况,可以释放锁时检查锁值是否为自己的UUID以及添加过期时间
基于Lua脚本,使用原子SET命令和Lua脚本的事务性,但仍存在锁续期困难和业务超时锁释放风险
基于Redisson的分布式锁,支持可冲入锁和自动续期,提供公平锁、联锁和红锁

9)HTTP1.0 2.0 3.0 区别
HTTP1.0:默认为短连接,每次请求都需要建立TCP连接,并通过Connection: keep-alive头来实现持久连接,不支持管道    化,主要使用If-Modified-Since/Expires来做为缓存判断的标准;
HTTP2.0:采用二进制格式而非文本格式,解析更加高效,支持多路复用允许单个TCP交错发送多个请求和响应,引入HPA    CK压缩算法,对请求和响应的头部信息进行压缩,消除冗余,允许客户端为请求设置优先级
HTTP3.0: 最新的HTTP协议,基于QUIC协议,QUIC使用udp传输数据,不存在队头阻塞问题,首次连接后具备0RTT优        势,减少延迟,允许网络切换时,将连接迁移到新的IP地址,默认采用TLS加密,保证数据传输的安全性

10) TCP的三次握手和四次挥手,为什么需要?
三次握手:客户端向服务器发送SYN表示请求同步,服务器向客户端发送SYN+ACK表示确认收到同步请求,可以确保客户    端的发送能力正常,客户端向服务器发送ACK表示确认,可以确认服务器的发送和接收能力以及客户端的接收能力正常,
   连接建立,通过三次握手能够保证通信双方的接收发送能力正常
四次挥手:客户端发送FIN+x序列号表示请求关闭连接,服务器发送ACK+x+1表示确认收到,客户端向服务器的通道关        闭,服务器发送FIN+y序列号表示请求关闭连接,客户端发送ACK+y+1表示收到,等待2MSL没有收到回复后关闭TCP连接,因为TCP是全双工的,双向链路分别需要发送和接收两次,所以是需要四次挥手。

11) 从输入网址,到最后访问页面的全过程
首先输入URL,进行URL解析,准备发送http请求
在请求之前,先本地查看浏览器缓存,如果缓存有该资源,直接返回,否则继续准备请求
发送请求之前,进行DNS域名解析,按照本地缓存,本地HOST,路由器缓存,DNS服务器,DNS根服务器顺序,直到查        询到URL对应的IP地址
三次握手建立TCP连接
构建请求并发送,包括请求行,请求头,请求体,并把和该域名相关的cookie放入请求头,构建HTTP请求,如果是https        还要进行加密
服务器处理请求,生成对应的响应并返回相应资源
四次握手关闭TCP连接
浏览器接收到响应后进行解析处理,如果是字节流可能是下载管理器进行下载,如果是html页面就是进行渲染生成页面。
全部评论
手撕代码mark
点赞 回复 分享
发布于 05-29 15:27 山东
太强了
点赞 回复 分享
发布于 05-14 00:45 北京
你不是c++吗
点赞 回复 分享
发布于 05-12 22:29 黑龙江
你不是c++吗
点赞 回复 分享
发布于 05-09 11:55 广东

相关推荐

隔壁投了之后又被捞起来面了,以下是TimeLine6.10&nbsp;投递6.12&nbsp;约面6.17&nbsp;一面6.26&nbsp;二面6.27&nbsp;三面7.1&nbsp;HR面7.4&nbsp;Offer一面:全程40min左右1.&nbsp;自我介绍2.&nbsp;开篇面试官介绍了一下这次面试的流程3.&nbsp;HashMap和HashTable的区别?4.&nbsp;接T3,针对HashTable的问题,有没有解决方案?(ConcurrentHashMap)5.&nbsp;线程和进程的区别?6.&nbsp;接T5,通信方式上有什么区别?7.&nbsp;MySQL索引结构?8.&nbsp;接T7,B树和B+树的区别是什么?9.&nbsp;接T8,为什么说B+树更好做范围查询?10.&nbsp;MySQL事务隔离级别?11.&nbsp;MVCC12.&nbsp;索引失效的情况都有哪些?13.&nbsp;Redis持久化方案?14.&nbsp;缓存雪崩、缓存穿透、缓存击穿15.&nbsp;讲讲TCP的三次握手和四次挥手16.&nbsp;说说Linux的常用命令?17.&nbsp;有没有用过Docker?说说Docker的常用命令?有自己构建过Docker镜像吗?18.&nbsp;项目拷打手撕:快速排序(问了比较时使用&amp;lt;和&amp;lt;=有什么区别)反问:1.&nbsp;面试官并不是Java方向的,为什么会问Java基础知识?2.&nbsp;组里技术栈?(Java、Go、PHP都有,看分到哪个组)3.&nbsp;后续面试流程?(2-3轮技术面+1轮hr)4.&nbsp;建议?追问:1.&nbsp;可能会转语言,是否接受?2.&nbsp;现在在长沙吗?如果面试通过到这边来会不会有什么阻碍或者困难?面完状态10min左右状态变成业务复试二面:全程40min左右,感觉主要是手撕1.&nbsp;自我介绍2.&nbsp;有用过MQ对吧,那你说说怎么解决消息重传的?3.&nbsp;你是怎么做消息幂等性处理的?4.&nbsp;接T3,如果说Redis的key已经存入了,但是刚好消费者宕机了,怎么办?5.&nbsp;建立索引的SQL语句是?6.&nbsp;TLS握手过程7.&nbsp;手撕1:单链表有一个指针指向任意一个节点,怎么删除这个指针指向的节点,如1→2→3→4,传入2,删除2,没有头指针(回答了更改节点值,next设置为next.next,追问怎么删除最后一个节点,不会,换了道题)8.&nbsp;手撕2:LeetCode199.&nbsp;二叉树的右视图(写了递归,要求再写一遍非递归)闲聊:1.&nbsp;什么时候能到岗?2.&nbsp;是哪里人?3.&nbsp;为什么会考虑来长沙这边?4.&nbsp;你觉得你的优点和缺点是什么?5.&nbsp;手上还有其他offer吗?反问:1.&nbsp;业务面完30min左右约三面三面:1.&nbsp;自我介绍2.&nbsp;拷打项目3.&nbsp;拷打实习4.&nbsp;我现在有一个student表,我要对name简历索引,sql语句怎么写?5.&nbsp;主键索引和普通索引有什么区别?6.&nbsp;为什么非聚簇索引要回表?7.&nbsp;MySQL隔离级别?8.&nbsp;MySQL主从同步原理?9.&nbsp;binlog日志存的是什么?10.&nbsp;Redis缓存雪崩是个什么概念?怎么解决?11.&nbsp;Redis持久化方式?12.&nbsp;HTTP报文格式?13.&nbsp;HTTP和HTTPS有什么不同?14.&nbsp;TLS握手过程?15.&nbsp;为什么是非对称加密和对称加密结合使用?能不能只使用一种?16.&nbsp;面向对象三大特性17.&nbsp;我现在有一个Java源代码,比如说叫xxx.java,他是如何变成一个二进制文件的能够让机器运行他的?这个中间的过程是怎么样的?18.&nbsp;JVM的作用是什么?19.&nbsp;进程和线程的区别?20.&nbsp;有没有了解过协程?跟线程的区别是什么?21.&nbsp;为什么说协程为什么更轻量?22.&nbsp;二进制文件加载进内存,他的分布是怎么样的?23.&nbsp;Linux上怎么看机器的负载?24.&nbsp;top命令哪些参数表示负载?25.&nbsp;Linux怎么看cpu的核数?26.&nbsp;Linux怎么查看当前目录占用了多少空间?27.&nbsp;查看当前服务器建立的tcp连接,用什么命令?28.&nbsp;tcp滑动窗口机制是怎么样的?29.&nbsp;time_wait状态是什么意思?30.&nbsp;为什么是四次挥手?31.&nbsp;三次握手是怎么实现的?中间的ACK和SYN是怎么合并的?32.&nbsp;用过docker吗?怎么做到容器间隔离的?33.&nbsp;怎么构建docker镜像?34.&nbsp;有了解AI吗?大模型训练过程是怎么样的?35.&nbsp;有没有了解过MCP?36.&nbsp;使用过什么AI工具?手撕:二叉树的层序遍历,要求null值使用*占位反问:1.&nbsp;面试结果什么时候出面完状态变为HR面HR面闲聊10分钟
面试问题记录
点赞 评论 收藏
分享
评论
5
21
分享

创作者周榜

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