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