腾讯一面+二面总结
前言
博主的腾讯一面总结
Java面C++岗:项目、操作系统、计网问的比较多
下面只是部分,面的有点久了,有些记不得了
1.项目
我的项目就不方便透露了,讲一点经验
1.1主要功能的数据库表的设计
这个非常重要,一定要吃透自己的项目的数据库表的关系,调理清楚,直接影响到你这个项目的真实性,这个问题没答好,基本就没了。
1.2 10分钟取消订单,那么我在9分59秒进行支付,如何保证一致性
这个问题非常经典,我的项目里面用的是RocketMQ实现
给订单设定状态:0未支付、1支付中、2已支付(存在redis,有效期20分钟)
在消费者收到取消订单的消息时,再判断是否是未支付状态:是(取消)并执行取消业务
1.3 给下一级审批人发短信,如何保证不会重复发短信(幂等+防宕机)
1.在发送给mq的时候,在redis存入下面图片(过期时间根据业务决定)
业务代码,仔细看下面的步骤
public void listen(String phone) {try{//1.判断幂等token是否消费过//1.1 value=0(未被消费、未发短信)//消费消息逻辑,发送短信后value=1,完成消费删除token//1.1 value=1(未被消费完成,但是已经发送短信)//这个情况对于的是消费到一半,消费者宕机,防止重复发消息,删除token//1.2 找不到token已经消费完成//2.发送ACK到mq}catch (Exception e){//异常逻辑,后续mq重发消息}}
2.数据库+事务实现(面试官的场景题)(他没解答方案)
我的思路其实和上面差不多(phone表(token、value))
但是回滚我认为不太好,大家可以留下自己的想法
1.4限流设计
令牌桶(将余票放到redis里面的set集合)只有抢到令牌才可以进行下一步操作
2操作系统
2.1进程、线程、协程
2.2 进程竞争态是如何解决的
下面的内容看完
2.3 死锁的条件
2.4 虚拟内存和物理内存如何映射
2.5 500mb内存的服务器如何运行需要1G内存的应用
3.计网
3.1 我们视频面试中用到了哪些协议
3.2 https四次握手过程
追问如何防范别人冒充
再追问为什么要有第三方的出现
如何确保第三方不被冒充(问道这里直接不会了导致二面挂了)
4.算法
4.1题目一
代码
import java.util.Scanner;public class Main {static boolean flag=false;public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();dfs(str,0,0);System.out.println(flag);}private static void dfs(String str,int index,int cnt){if(flag)return;if(index==str.length()){if(cnt==0){flag=true;}return;}if(cnt<0)return;if(str.charAt(index)=='('){dfs(str,index+1,cnt+1);}else if(str.charAt(index)==')'){dfs(str,index+1,cnt-1);}else{//1.(dfs(str,index+1,cnt+1);//2.dfs(str,index+1,cnt);//3.)dfs(str,index+1,cnt-1);}}
}
4.2题目二(求最长严格递增子序列,不必连续)
代码
public class Main {public static int maxLen=0;public static void main(String[] args) {int[] nums={10,9,2,5,3,7,101,18};dfs(nums,0,Integer.MIN_VALUE,0);System.out.println(maxLen);}private static void dfs(int[] nums,int index,int father,int len){if(index==nums.length){maxLen=Math.max(maxLen,len);return;}if(nums[index]>father){dfs(nums,index+1,nums[index],len+1);dfs(nums,index+1,father,len);}else{dfs(nums,index+1,father,len);}}
}
4.3比较compareVersion('1.1','1.2')版本号小-1,等0,大1
非常中的是"."不可以作为split分割符
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();String[] split = str.split("'");StringBuffer s1=new StringBuffer(split[1]);for (int i = 0; i < s1.length(); i++) {if (s1.charAt(i) == '.') {s1.setCharAt(i,',');}}StringBuffer s2=new StringBuffer(split[3]);for (int i = 0; i < s2.length(); i++) {if (s2.charAt(i) == '.') {s2.setCharAt(i,',');}}String ss1 = s1.toString();String ss2 = s2.toString();int[] num1 = Arrays.stream(ss1.split(",")).mapToInt(Integer::parseInt).toArray();int[] num2 = Arrays.stream(ss2.split(",")).mapToInt(Integer::parseInt).toArray();int flag=0;int i=0;while(i<num1.length&&i<num2.length){if(num1[i]>num2[i]){System.out.println(1);return;}else if(num1[i]<num2[i]){System.out.println(-1);return;}i++;}while(i<num1.length){if(num1[i]>0){flag=1;}i++;}while(i<num2.length){if(num2[i]>0){flag=-1;}i++;}System.out.println(flag);}
}