其他分享
首页 > 其他分享> > 字节跳动 面试 复盘 回顾 2021 过客局

字节跳动 面试 复盘 回顾 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 表示对表达式进行下取整

注意:

  1. 通常设置 M 为 2 的幂次方。
  2. W 为计算机字长大小(也为2的幂次方)。
  3. 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/212708https://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