2023-08-07 字节跳动 后端开发 一面
1 自我介绍: 学历背景-实习/项目-校园经历-获奖 2 介绍一下java全栈实习:业务-解决方案-工作-成果-反思 3 xx功能怎么做的:业务-表设计-前端原型-功能-前后端接口-后端实现 4 订单管理 货物管理怎么做的:xxx 5 数据存储用的啥: mysql 给主键 常用字段加索引 6 货物限量怎么处理: java加锁(锁的比较与选择)/ 数据库事务(考虑了吗,为什么没用) 7 单体应用,某个功能故障了怎么办,会不会系统不可用? 8 分布式怎么保证货物限量秒杀数据一致:redis setnx等 9 用户下单但一直没支付,占用锁怎么办:setnx设置有效期 10 你刚说redis,redis zset的底层原理知道吗: 压缩列表、跳表 11 介绍一下压缩列表、跳表应用场景: 介绍跳表和压缩列表的特点原理,压缩表:小数据量,快速定位数据,增删, 跳表:排序,排行榜等,更大数据量,更快搜索定位,更大内存占用。 这里我将跳表的思想和B+树的思想很像提了一下(给自己挖坑) 12 redis 为啥用跳表不用B+树,那个更快:搜索上,B+是
l
o
g
m
n
log_mn
l o g m n ,跳表是
l
o
g
2
n
log_2n
l o g 2 n ,所以B+快一点。但使用情况要根据业务情况决定,B+树数据量更大(指针位占用空间更多),占用更多存储空间,维护开销更大,而redis是内存操作,在同一个数量级的操作上,需要尽量节省点空间 13 mysql 为啥用B+不用跳表:本身存储空间充足,数据量更为庞大,mysql这里的B+是用作索引,希望更快找到数据,所以用B+ 14 B+更快,但redis不用B+,你说的不矛盾吗:不矛盾,是实际业务决定了他们数据结构的特点,redis内存操作,数据量比mysql存储数据量更小,在这种情况下,二者查询效率差距不大,而跳表能节省出更多的内存,此外跳表维护数据增加成本比B+树小,不用旋转维护平衡,因此,综合考量选跳表。mysql是磁盘上存储,数据量比redis大得多,这种情况b+能比跳表更快一些(IO磁盘次数大幅减少),帮助更快查数据,而且存储空间比内存多得多,不用太过考量空间成本,所以综合选B+。此外还有的考量就是 跳表实现更简单yyds 15 计算机网络,说一说tcp udp的区别:传输层 有无连接 可靠交付与否 拥塞控制与否 全双工 一对一 多对多等等 协议格式不同 长度不用 16 TCP拥塞控制过程:拥塞是什么,为什么拥塞会出现。慢开始、拥塞避免、快重传、快恢复过程 16 为啥快恢复窗口设为原来1/2:不知道,我感觉实时监控网络流量,自适应选择阈值更合适比如1/2、 1/4。 17 为啥四分之一,用过吗:没用过,四分之一可以位运算,更快点 18 进程 线程区别:资源单位、调度单位、系统开销、通信比较 19 你刚说套接字进程通信,那一个主机内两个进程套接字通信会走网路吗:协议栈走一遍,到网卡会判断是否走网络 20 手撕牛肉bushi,代码:搜索旋转排序数组:二分搜索,log(n) 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0
输出:-1
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int pivotIndex = binaryIndex(nums,n);
int ans = -1;
if(nums[pivotIndex] == target){
return pivotIndex;
}else if(pivotIndex==0 ){
ans = binarySearch(nums,0,n-1,target);
}else if(nums[0] > target){
ans = binarySearch(nums,pivotIndex,n-1,target);
}else{
ans = binarySearch(nums,0,pivotIndex,target);
}
return ans ;
}
public int binarySearch(int[]nums,int l,int r,int target){
int left = l;
int right = r;
int mid = (right - left) / 2 + left;
while(left<=right){
if(nums[mid] == target){
return mid;
}else if(nums[mid]<target){
left = mid + 1;
}else{
right = mid - 1;
}
mid = (right - left) / 2 + left;
}
return -1;
}
public int binaryIndex(int[]nums,int n){
int left = 0;
int right = n-1;
if(nums[left]<=nums[right])return left;
int mid = (right - left) / 2 + left;
while(left < right){
mid = (right - left) / 2 + left;
if(nums[mid]>nums[mid+1])return mid + 1;
else if(nums[mid]<nums[right])right = mid;
else left = mid + 1;
}
return right;
}
}