字节跳动 后端开发 一面 面经

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 logmn,跳表是 l o g 2 n log_2n log2n,所以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;
    }
}
  • 21 反问:xxx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我喝AD钙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值