字节跳动 三次失败的一面

抖音一面挂

2020/4/1

字节跳动直播中台 头条客户端凉经

2020/2/14

  • 抽象类与接口

  • 垃圾回收(然后我说了四种引用什么时候GC)

  • 什么时候发生内存泄漏、内部类引用外部类泄漏是什么原因

  • hashMap怎么实现,他的get、put是怎么实现的

  • 死锁,怎么避免。

  • synchronized锁是什么锁(我就说了是系统的同步互斥锁)原理应该是monitor(监视器)

  • 你的项目中注册登录是怎么实现的

  • http四次挥手

  • http状态码

  • 算法题:leetCode.120 没做出来。。。

    class Solution {
      public int minimumTotal(List<List<Integer>> triangle) {
          if(triangle == null || triangle.size() == 0){
              return 0;
          }
          //二维数组dp[][]
          // int[][] dp = new int[triangle.size()+1][triangle.size()+1];
          // for(int i = triangle.size()-1; i>=0; i--){
          //     List<Integer> curTri = triangle.get(i);
          //     for(int j = 0; j<curTri.size(); j++){
          //         dp[i][j] = Math.min(dp[i+1][j], dp[i+1][j+1]) + curTri.get(j);
          //     }
          // }
    
          // // 只需要记录每一层的最小值即可 
          // int[] dp = new int[triangle.size()+1];
          // for(int i = triangle.size()-1; i>=0; i++){
          //     List<Integer> curTri = triangle.get(i);
          //     for(int j  = 0; j<curTri.size(); j++){
          //         //这里的dp[j] 使用的时候默认是上一层的,赋值之后变成当前层
          //         dp[j] = Math.min(dp[j], dp[j+1]) + curTri.get(j);
          //     }
          // }
          // return dp[0][0];
    
          //标准On
          int n = triangle.size();
          int[] dp = new int[n];
          for(int i = 0; i < n; i++) 
            dp[i] = triangle.get(n - 1).get(i);
          for(int i = n - 2; i >= 0; i--) {
            for(int j = 0; j <= i; j ++) {
              dp[j] = Math.min(dp[j], dp[j+1]) + triangle.get(i).get(j);
            }
          }    
          return dp[0];
    
          //递归法
          //return minimumTotalHelper(triangle, 0, 0, new int[triangle.size()][triangle.size()]); 
      }
    
      int minimumTotalHelper(List<List<Integer>> triangle, int row, int col, int[][] memo){
          if(memo[row][col] != 0) return memo[row][col];
          if(row == triangle.size()-1){
              return memo[row][col] = triangle.get(row).get(col);
          }
          int left = minimumTotalHelper(triangle, row+1, col, memo);
          int right = minimumTotalHelper(triangle, row+1, col+1, memo);
          return memo[row][col] = Math.min(left,right) + triangle.get(row).get(col);
      }
    }

字节跳动 头条客户端凉经

2020/1/19

  • 自我介绍

    算法题:

  • Q:找出一个数组的长度Top k的升序子数组,并按长度降序输出。
  • 输入:[2,1,4,5,8,3,7,10,2,5] k=2
  • 输出:[1,4,5,8],[3,7,10]
  • 思路:刚开始和面试官聊思路,我以为是找出升序子数组然后把他们里面的元素降序输出,做完后才发现理解错题意了。题目的意思就是找出升序子数组,按照子数组的长度降序输出子数组。。。
public class Main {

    public void reverse(int[] array, int k){
        //找升序子数组
        int[] pivot = new int[k];//存第i个子数组的开始坐标
        int[] end = new int[k];//存第i个子数组的结束坐标
        int j = 0;
        int pivot_temp = 0;
        int end_temp = 0;
        for(int i=0; i<array.length;){
            if((i != array.length-1) && (array[i] > array[i+1])){
                if(end_temp > pivot_temp){
                    pivot[j] = pivot_temp;
                    end[j] = end_temp;
                    j++;
                }
                i++;
                pivot_temp = i;
                end_temp = pivot_temp;
            }else{
                i++;
                end_temp++;
            }

        }
        /*
          按照子数组长度降序
         */
        int[] len = new int[k];
        int[] index = new int[k];//存储降序顺序  index 与len 一一对应
        for(int i=0; i<k; i++){
            len[i] = end[i] - pivot[i] +1;
            index[i] = i;
        }
        for(int i=0; i<k; i++){//选择排序   //index[i]  是存Top i长度max的数组的索引
            for(int w=i; w<k; w++){
                if(len[w] > len[i]){
                    int temp = len[w];
                    len[w] = len[i];
                    len[i] = temp;
                    int index_temp = index[w];
                    index[w] = index[i];
                    index[i] = index_temp;
                }
            }
        }
        //输出
        for(int i=0; i<k; i++){
            System.out.print("[");
            for(int w=pivot[index[i]]; w=end[i]; w--    没把for循环条件改回来导致输出为空,只说了思路开始问java基础。好亏啊这种窒息操作
                if(w == end[index[i]]){
                    System.out.print(array[w]);
                }else{
                    System.out.print(array[w] + ",");
                }
            }
            if(i == k-1){
                System.out.print("]");
            }else{
                System.out.print("],");
            }
        }

    }

    public static void main(String[] args) {
        int[] test = new int[]{2,1,4,5,8,3,7,10,2,5};
        Main main = new Main();
        main.reverse(test,2);
    }
}
  • 大佬们有更简单的麻烦贴一下,我学习学习,实在是太菜了。

    Java基础

  • 说一说Java内存模型、JVM内存模型
  • HashMap怎么实现的
  • 线程 wait()和sleep()区别
  • 线程安全怎么实现
  • 说一说垃圾回收算法

    Android基础(估计是看我有Android基础才问的。0基础不会问,我看其他0基础的问的大都是计网和java基础!啊!没复习啊!)

  • Android页面绘制流程
  • Handler在子线程怎么使用
  • 就完了......
#字节跳动##校招##安卓工程师##面经#
全部评论
package LeetCode.ByteDance; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /**  * @Author :FANG MIAO  * @Date :Created on 2020/2/5 15:26  * @Description:寻找前k个递增序列  * 输入:[2,1,4,5,8,3,7,10,2,5] k=2  * 输出:[1,4,5,8],[3,7,10]  */ public class TopKLenArray {     public static List<List<Integer>> topKArray(int[] arr, int k) {         if (k == 0)             return new ArrayList<>();         int[] dp = new int[arr.length];         Arrays.fill(dp, 1);                  for (int i = 1; i < arr.length; i++) {             if (arr[i] > arr[i - 1])                 dp[i] = dp[i - 1] + 1;         }         List<List<Integer>> res = new ArrayList<>();         //找最大的前k个子数组         for (int i = 0; i < k; i++) {             //找当前最大值             int maxIndex = 0;             for (int j = 0; j < dp.length; j++) {                 if (dp[j] > dp[maxIndex]) {                     maxIndex = j;                 }             }             int len = dp[maxIndex];//最长数组的长度             List<Integer> curArr = new ArrayList<>();             for (int j = maxIndex - len + 1; j <= maxIndex ; j++) {                 curArr.add(arr[j]);                 dp[j] = 1;//将这里重置,要不然后面的循环会有问题             }             res.add(new ArrayList<>(curArr));         }         return res;              }     public static void main(String[] args) {         int[] arr = {2,1,4,5,8,3,7,10,2,5};         List<List<Integer>> res = topKArray(arr, 2);         for (List<Integer> l:              res) {             for (int num:                  l) {                 System.out.print(num);                 System.out.print(" ");             }             System.out.println();         }     } } 楼主这题可以用dp哈。看来字节比较喜欢考dp和backtrack。 另外问一下楼主知道是哪里没有答好导致没通过吗? 谢谢~
2 回复 分享
发布于 2020-02-05 15:49
java基础看了就忘,就是说不出来😪
1 回复 分享
发布于 2020-01-19 17:46
是实习还是正式啊
点赞 回复 分享
发布于 2020-01-19 20:27
楼主面的哪个部门呀?
点赞 回复 分享
发布于 2020-01-20 01:37
没有直接二面是不是就挂了。。。一面结束面试官叫我回去等通知。😥😥😥
点赞 回复 分享
发布于 2020-02-07 15:44
大兄弟是不是北邮的考研友军。
点赞 回复 分享
发布于 2020-02-19 16:57
几面挂的呀?
点赞 回复 分享
发布于 2020-03-05 17:51
那个算法题最长的升序子数组长度不是5吗。1458.10
点赞 回复 分享
发布于 2020-03-10 22:31
楼主你连续投了三次字节,有影响么?我也失败2次了。第二次面试的时候面试官直接问我上次挂的原因,自己总结
点赞 回复 分享
发布于 2020-06-15 14:51

相关推荐

重生2012之我是java程序员:换个稍微正式点的照片吧
点赞 评论 收藏
分享
6 63 评论
分享
牛客网
牛客企业服务