字节跳动 面试 复盘 回顾 2021 过客局
作者:互联网
面了字节的Java后端,其实面试之前是有点慌的,最近一直在准备论文,基本没怎么复习,偶尔帮同学做做题会看一看,基本上都是用到了再去查资料学习。所以字节这次面试称为过客局也不为过。面试完心里拔凉拔凉的,这件事告诉我们的教训是:第一还是要认真复习,多刷刷题,多练练手,编程题因为用了牛客网,根本没用提醒和代码补全,我直接数组定义都没写对;第二就是简历问的很细,最好及时复盘一下,很多知识重在平时积累。下面回顾一下面试问题:
1.先问用过什么数据库,然后问到数据库的索引,让根据抖音的关注列表设计一个数据库结构
当时回答了Mysql,介绍了一下项目用的索引,因为使用的不是很多也差不多忘记了,所以面试官举了个例子让我分析。抖音的关注列表我当时是设计了关注用户的ID和被关注用户的ID、头像、昵称和关注时间戳这几个。考虑到两个ID都是外键,查询需要联表,所以加了头像和昵称,也说了这样会快但是会造成信息不一致。然后面试官问如何加索引,希望得到时间戳排序的结果。
先来科普,索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。
感觉索引做不了排序,所以就只在ID上加了主键索引,想的是查表也是根据ID作为where条件。排序的话使用order by直接排就行,应该也不需要索引(学艺不精的狗头)
2.一道设计题,要求给定一个输入:https://blog.csdn.net/Ximerr/article/details/115441000类似这种的,然后输出一个https://blog.csdn.net/HK5fM,要求这个输出可以唯一对应一个输入,同一个输入的每次输出不一样。感觉其实就是邀请码这种,给定了最后字符有五个,取值范围是62个常规字符。要求设计一个具有这种功能的算法。输入输出均为字符串,问了面试官可以使用数据库。
输入:
https://interview.nowcoder.com/interview/31022844/interviewer?code=urXY3kZA#hrCode
https://interview.nowcoder.com/interview/31022844/interviewer?code=urXY3kZA#hrCode
输出:
https://short.nowcoder.com/Xf3FG/
https://short.nowcoder.com/Xf4FG/
感觉就用一个哈希函数就可以,讲了每次加入时间戳进行哈希,然后将结果的对应关系保存到数据库。然后面试官问了具体的哈希过程,完全忘记了,主要是如何生成符合要求的字符串。最后只说可以哈希可以实现从高维空间到低维空间的映射,之前也都是直接用了,没去细究!
哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。几种常见的Hash算法:
① 除法哈希法 公式:hash(key) = key mod M (
注意:M 通常为“素数”)
② 乘法哈希法 公式:hash(key) = floor( M/W * ( a * key mod W) )
其中 floor 表示对表达式进行下取整
注意:
- 通常设置 M 为 2 的幂次方。
- W 为计算机字长大小(也为2的幂次方)。
- a 为一个非常接近于W的数。
其实,“乘法哈希”的思想就是:提取关键字 key 中间 k 位数字。
③ 斐波那契(Fibonacci)哈希法 也就是当 “乘法哈希法” 的 a ≈ W/φ
,1/φ ≈ (√5-1)/2 = 0.618 033 988
时情况。而,1/φ ≈ (√5-1)/2 = 0.618 033 988
,可称为黄金分割点。
看完感觉面试官其实问的是怎么处理字符串,继续百度:由哈希函数的性质,对于一个字符串:S=s1s2...sn,我们把每个字符转换成idx(si)=si-'a'+1 当然直接用字符串的ASCII码表示也可以,则哈希模型为Hash(i)=Hash(i-1)*p+idx(si),其中p为素数。最终算出的Hash(n)作为该字符串的哈希值。
又联想到其实使用md5和sha256这类的现有哈希算法也不错,https://baike.baidu.com/item/MD5/212708和https://baike.baidu.com/item/SHA256/9726070可以记一下。对于生成位数为5,我认为可以直接截取,或者用生成的结果循环相加取模。
3.操作系统课程的内存管理是如何进行的,完全没学过,还问了如何将内存分配给进程?
JVM 中的内存可以划分为若干个不同的数据区域,主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区。
具体细节可参考:
https://blog.csdn.net/qq_38366111/article/details/105956049
https://blog.csdn.net/qq_32744005/article/details/51830729
4.最后一个题是个力扣的编程题,给定一个一维数组用于描述一个海拔,相邻的海拔高度不同,则下雨后低洼海拔的洼地会有积水,假设雨水足够,能够填满所有低洼地段,计算下雨后所有低洼地段总蓄水量。例如给定数组为:5, 2, 1, 4, 3 则:所有低洼地段蓄水为量为 5
大概做了一下,但感觉不一定对,力扣还是要多刷~
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//Scanner in = new Scanner(System.in);
//int a = in.nextInt();
//System.out.println(a);
System.out.println("Hello World!");
int[] a = {5, 2, 1, 4, 3};
ArrayList<Integer> max = new ArrayList<>();//存放峰值
int allWater = 0;
for (int i = 0; i < a.length; i++) {
if (i != 0 && i != a.length - 1) {
if (a[i] >= a[i - 1] && a[i] >= a[i + 1])//去重复
max.add(i);
}
}
for (int j = 0; j < max.size() - 2; j++) {
if ((max.get(j + 1) - max.get(j)) > 1) {
int high = (a[max.get(j)] >= a[max.get(j + 1)] ? a[max.get(j + 1)] : a[max.get(j)]);
int water = 0;
for (int k = max.get(j) + 1; k < max.get(j + 1); k++) {
water += (high - a[k]);
}
allWater += water;
}
}
System.out.println(allWater);
}
}
标签:https,get,int,max,索引,过客,哈希,复盘,2021 来源: https://blog.csdn.net/Ximerr/article/details/115873761