2020年1月字节跳动(EE部门)实习面试经历及总结

笔者刚大三上结束,前两周刚刚忙完期末复习(前面的几篇博客全是期末复习总结),已经几周没碰代码了,想着考完就好好做一下服务外包比赛的东西。字节跳动的这次经历完全横空出来的,事先并没有这一计划。

6号上午考完马克思(还好没炸,80多稳稳当当),下午的时候QQ收到好友验证,说是字节的业务同学,最近字节有实习招聘,让我帮忙在学校宣传一下(不知道哪儿弄得我的QQ),我答应了,还说可以直接给我安排(有点开心)。

7号 我就把简历投给了字节,其实没报太大希望,我本来也没想找实习,不过有机会锻炼,积累一下经验也不错嘛。

8-9号没收到任何消息,心想多半是凉凉~,打算开始做自己的项目了,10早上打开电脑,收到一封Gmail邮件,竟然是字节的笔试邀请,下午4-6点完成牛客网在线笔试,三道编程题,难度不是很大,第三道操作系统的LRU算法,很久没复习,忘记了,这里还是记一下:

笔试题


1、五进制转七进制(大概意思是用字母a-e分别表示0-4,a-g表示0-6,键盘输入一个五进制bcde,转成七进制dgf)
import java.util.Scanner;

/**
 * @author 龚涛
 * @date 2020/1/10 17:26
 * 编码不要畏惧变化,要拥抱变化
 * 
 * 思路:
 * 五进制和七进制似乎没什么特殊关系,直接转就不行了
 * 首先肯定是要把输入的五进制字母字符串转成五进制数字
 * 再将其转成十进制数(可以使用 Integer.parseInt() 实现)
 * 接着把十进制数转成7进制数(可以使用 Integer.toString() 实现)
 * 最后将数字映射成a-g的字母字符串
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //接收输入
        String input = in.nextLine();
        char[] array = input.toCharArray();
        int flag = 'a' - '0';
        for (int i=0;i<array.length;i++){
            array[i] -= flag;
        }
        StringBuilder num5 = new StringBuilder();
        for (char c :
                array) {
            num5.append(c);
        }
        //5进制字符串转10进制数字
        int num = Integer.parseInt(num5.toString(), 5);
        //10进制数字转成7进制字符串
        String num7 = Integer.toString(num, 7);
        char[] array1 = num7.toCharArray();
        StringBuilder res = new StringBuilder();
        for (int i =0;i<array1.length;i++){
            array1[i] += flag;
            res.append(array1[i]);
        }
        System.out.println(res);
    }
}

2、给定一个有序整数数组arr和一个待查找数key(都是从键盘输入),返回key在数组arr中最后一次出现的位置(数组下标),要求用二分查找实现。

import java.util.Scanner;

/**
 * @author 龚涛
 * @date 2020/1/10 15:44
 * 编码不要畏惧变化,要拥抱变化
 *
 * 思路:
 * 因为是有序数组(从小到大),计算中位数下标mid,将 key 和数组 arr[mid] 进行比较
 * 如果 key 大于mid,则将最小的数设置为mid+1,继续二分查找
 * 如果 key 小于mid,则将最大的数设置为mid-1,继续二分查找
 */
public class Main {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,4,4,4,5,6};
        System.out.println(last(arr,4));
    }

    private static int last(int[] a, int key){
        int min= 0 , max = a.length-1;
        int mid = 0;
        while (min<=max){
            mid = (max + min + 1)/2;
            if (key >= a[mid]){
                min = mid;
            }
            else {
                max = mid - 1;
            }
            if (max==min){
                break;
            }
        }
        if (key != a[max]){
            return -1;
        }
        else {
            return max;
        }
    }
}

3、实现LRU算法

//LRU算法C++实现
#include<iostream>
#define N 3
using namespace std;
int main()
{
    int ym[]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
    int lru[N]={1,0,7};
    int len[N]={0,0,0};
    int allchagetimes=0;
     for(int t=0;t<N;t++)
       {
           cout<<lru[t]<<"  ";
       }
       cout<<endl;

   for(int i=3;i<20;i++)
   {
       int flag=0;
       int j=0;
       int sum=0;
       for(;j<N;j++)
       {
           if(ym[i]==lru[j])
           {
               flag=1;
               break;
           }
           else if(ym[i]!=lru[j])
           {
               sum++;
               if(sum==3)
               {
                   flag=0;
                   break;
               }
           }


       }

       if(flag==1)
       {
           int temp=lru[0];
         if(j==0)
         {

         }
         else if(j==1)
         {
            lru[0]=lru[j];

             lru[2]=lru[2];
             lru[1]=temp;
         }

         else if(j==2)
         {
             lru[0]=lru[j];

             lru[2]=lru[1];
             lru[1]=temp;

         }

       }
       else if(flag==0)
       {
           allchagetimes++;
           lru[2]=lru[1];
           lru[1]=lru[0];
           lru[0]=ym[i];


       }

       for(int t=0;t<N;t++)
       {
           cout<<lru[t]<<"  ";
       }
       cout<<endl;
   }

   cout<<"缺页"<<allchagetimes+3 <<"次,置换"<<allchagetimes<<"次"<<endl;

}

面试题

勉强笔试过了,整理一下面试题吧。因为我投的后端,用Java语言开发,问题有点多,记不大清了,主要以下几个问题(问题答案后期逐个更新):

1)Java中volatile关键字的作用?

2)Java中static的作用?

3)SQL索引的数据结构?

4)SQL连接查询:左连接、右连接、外连接、内连接的区别?

5)项目相关问题(根据简历上的项目经历来问)

6)手写代码:将一个数字字符串转换成数字类型,如果超过int32的最大值,则返回-1

 import java.util.Scanner;

/**
 * @author 龚涛
 * @date 2020/1/13 17:51
 * 编码不要畏惧变化,要拥抱变化
 */
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println(func(input));
        sc.close();
    }
    private static long func(String input){
        char[] chars = input.toCharArray();
        long sum = 0;
        for (char aChar : chars) {
            sum = sum * 10 + (aChar - '0');
        }
        if (sum > Math.pow(2,31)-1) {
            return -1;
        }
        return sum;
    }
}

总结一下:

1、第一次面试,很多东西虽然都知道一些,但是说的时候都和想的不一样,知其一不知其二,平时只顾着做项目,学习新兴技术,无脑调用各种API,很少关注底层实现,导致基础薄弱。
2、通过这次经历,懂得还是应该重视基础,算法能力需要大大提高,对于cs专业的我们来说,数据结构非常重要,一定要清楚原理,配合coding提升动手能力(手撸代码真的考验功夫)剑指offer至少得认真的做一遍!
3、每一门编程语言的基础知识都需要很熟练的掌握,有时候往往我们觉得很简单的东西,到了面试官那里,说不定就能让你现场翻车,所以还是好好复习,打好基础,才能走的更远,拿到心仪的offer!


结束!!!
发布了19 篇原创文章 · 获赞 24 · 访问量 4619

猜你喜欢

转载自blog.csdn.net/qq_41337581/article/details/103955179