1.5年Java开发经验面试字节跳动总结

写在前面

字节的面试官都比较好,社招面试字节的话尽量走内推,然后HR会跟你定面试时间,现在面试大都是视频面试,字节一般是在牛客网上,会有一两道算法题,不过不会太难,一般都是LeetCode上简单到中等难度的题,所以大家不要把字节的算法想的太难,要把数据结构的基础足够重视,然后灵活利用这些基本的数据结构去解决问题,然后面试官会直接从你的项目中开始聊,所以项目一定要写自己负责的模块,以及遇到的困难怎么去解决的等等。

经典问题回顾
  1. 在涉及支付的接口是如何保证接口的高可用,以及在遇到弱网条件下,发出的请求没有回复怎么办?
  2. 消息队列问题,如何保证消息的可靠性,不被重复消费,多个相同的消息,如何保证只消费一次?
  3. 你负责的功能模块的UV怎么去做的?对于某些某段时间内求情次数非常大的用户如何去处理呢?
  4. Redis基本数据类型底层是怎么去实现的?有了解过吗?
  5. 在浏览器输入网址敲下回车后发生了什么?从网址DNS解析到HTTP三次握手等过程
  6. 在服务的多节点情况下,如何保证请求不会被分配到坏的节点上去的?
  7. Redis分布式锁是怎么做到的?锁的过期时间怎么去设计的?如何保证当前锁不会释放掉其他锁?
  8. HTTPS和HTTP的区别,HTTPS是如何防止消息被篡改的呢?HTTPS有用到对称加密吗?哪些地方用到了?
  9. 写一个算法题吧,给一个有序的int数组和数组当中元素k,输出元素k在数组当中出现的次数。
    例如:[2,3,4,5,5,5,6,8] k=5 output:3 要去算法的时间复杂度不超过O(n),也就是说不能去遍历数组了
  10. 好,这道写不出来再来一道,用两个栈实现一个队列
    其实发现算法题确实不难,然后大厂都比较关注项目当中的一些极端特殊情况下怎么去解决问题,基本都是分布式高并发的情况下去提问题。

个人整理了一下答案,发现其实对于我们这种1到3年的开发经验的来说要求还是比较高的,所以大家要加油啊。


A1. 现在还印象清晰,面试官问我项目当中的某个缴费接口,大概意思就是钱已经扣了但是没收到接口的回复,服务当时宕机了或者弱网情况下,这种情况怎么去处理?我私下请教了大神说这部分面试官在考察我的事务特性、隔离机制、事务传播的知识点;无非就是Spring的七大事务传播特性和五种事务的隔离级别,隔离级别除了default是默认采用数据库的隔离级别,其他四种就是RU(Read Uncommit) RC(Read commit) RR(Repeatable Read) 以及可串行化(Serializable);
Spring的七大事务传播特性:

1.propagation_required(支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择)
2.propagation_supports(支持当前事务,如果当前没有事务,就以非事务方式执行)
3.propagation_mandatory(支持当前事务,如果当前没有事务,就抛出异常)
4.propagation_requires_new(新建事务,如果当前存在事务,把当前事务挂起)
5.propagation_not_supported(以非事务方式执行操作,如果当前存在事务,就把当前事务挂起)
6.propagation_never(以非事务方式执行,如果当前存在事务,则抛出异常)
7.propagation_nested(如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作)】

可以拿一个用的比较多的事务特性说一下,比如propagation_required,支持当前事务,如果没有事务就新建事务;比如说当前一个method1里面调用了一个method2,这两个方法都加上@Transactional(propagation=Propagation.required)
如果method1里面发生异常 就会回滚rollback

现在才发现是考察的 分布式事务的解决方案!


A2. 我当时说我平时项目当中用的是Kafka,苦笑;然后我私下请教大神,这部分到底咋回答;其实这个在生产端是由我们使用的消息队列工具决定的Kafka还是rabbitMQ还是RocketMQ;在消费端我们开发者可以使用分布式锁来控制,当然分布式锁是其中一种的解决方案;


A3. 其实这个问题面试官是想考察你对Redis基本数据类的灵活运用,做UV的话那就是用Zset这种数据类型,然后面试官问了对于那些在极短时间内点击次数很多的用户是怎么去处理的呢?应该这个地方考察的是幂等性吧?说白了也就是分布式锁


A4. Redis基本数据类的底层的实现?众所周知redis使用C写的,那想知道这个只能去看Redis的源代码了,好吧要求很高,大家百度一下简单了解一下,估计面试官也不会深入为难了


A5. 浏览器输入地址敲回车之后发生了什么?其实面试官想考察一个整体流程的了解,包括浏览器的缓存到操作系统的缓存,然后到路由器DNS解析域名找到对应的ip,


A9. 首先不能直接暴力遍历整个数组,这不是面试官想要的解法;而且是有序的数组,所以适合用二分法,以下是个人写的时间复杂度是 l o g n logn logn

public class BinarySearchDemo {
    public static void main(String[] args) {
        int[] arr = {2,3,4,5,5,5,5,6,6,6,6,6,6,7,8,9,10,12,12};
        int count=0;
        int index = myBinarySearch(arr,6);
        for (int i=index; i < arr.length; i++) {
            if (arr[i]==arr[index]) count++;
            else break;// 这里的break还是必要的
        }
        for (int j=index; j >= 0; j--) {
            if (arr[j]==arr[index]) count++;
            else break;// 这里的break还是必要的
        }
        System.out.println(count-1);// 上面两个循环每次都在当前这个元素加了1,所以最后减一就行
    }

    private static int myBinarySearch(int[] arr, int target){
        int start=0, end=arr.length-1;
        while (start+1<end){
            int mid = start + (end-start)/2;
            if (arr[mid]==target) return mid;
            else if (arr[mid]>target) end = mid;
            else start = mid;
        }
        if (arr[start] == target ) return start;
        if (arr[end] == target) return end;
        return -1;
    }
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值