About Intetview0

这是笔者在2020年3月,人生中第一场面试的记录。

致谢

把这篇文章献给所有我在牛客网上认识的同学们。

正是因为他们的鼓舞,让我在求职路上愈挫愈勇,虽然最后春招实习就剩下我 0 Offer,但是还是感谢他们。

正文

自我介绍

  • 自我介绍主要叙述了学校专业,实习经历以及项目经历。

  • 自我介绍的时候网络信号不好,所以面试官估计没有听清太多Orz。

项目切入 / Redis / MySQL

面试官从项目切入,主要了解项目中 Redis 对于高并发场景以及作为消息分发系统的机制。

项目 Redis 中使用的数据结构是什么?

因为小公司项目 Redis 用的是 String 数据结构。Redis的数据结构

为什么手动淘汰 Redis 中的数据,不使用 Redis 的内存淘汰机制?

因为 Redis 的内存淘汰机制是对 Key 值进行筛选,而项目中的机制是对 Value 值的筛选。Redis 内存淘汰机制

同时对 Redis和数据库进行内存更新的时候,如何保证操作的成功 / Redis更新后线程挂掉了怎么办?

  • 出事前可以采用 Redis 集群的方式,采用先写数据库的方式,保证一致性。

数据库用的是什么?说说数据库事务的特性。

计算机网络 / DNS / HTTP

了解 HTTP 协议吗?

  • HTTP 是超文本传输协议,基于 TCP 协议。

HTTP 协议的连接过程?

  • 请求 TCP 连接 首先,浏览器与 Web 服务器的 HTTP 80端口建立一个 TCP 套接字连接。

  • 发送 HTTP 请求

    通过 TCP 连接,浏览器向服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据组成。

  • 接受请求返回响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由浏览器读取。一个响应由状态行、响应头部、空行和响应数据组成。

  • 释放TCP连接

    若 connection 模式为 close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放 TCP 连接

    若connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。

  • 解析 HTML 内容

    浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

HTTP 协议的头部有哪些属性?

DNS 是什么?DNS 的查询过程?

DNS 是域名系统,通常用来解析域名为 IP 地址。

本地解析 通过本地缓存进行解析。

直接解析 向客户机所设定的局部 DNS 服务器发一个查询请求。

递归解析 局部 DNS 服务器向该域名的根域服务器查询,再由根域名服务器一级级向下查询

迭代解析 局部 DNS 服务器把请求转发至上一级 DNS 服务器,再请求上上级直到查询到该域名。

Golang

因为项目经历中使用了 Golang,所以面试官提问了 Golang 的基础问题。

Golang 的默认参数传递方式以及哪些是引用传递?

  • 默认采用值传递,且Go 中函数传参仅有值传递一种方式

  • slice、map、channel 都是引用类型

  • slice 能够通过函数传参后,修改对应的数组值,因为 slice 内部保存了引用数组的指针,并不是因为引用传递

Golang 的协程与 Java 线程的区别?

  • 协程是轻量级线程,多个协程可以由一个或多个线程管理

  • 协程无需上下文切换,没有线程之间切换的开销

  • 协程的调度不需要多线程的锁机制,因为只有一个线程,不存在同时写变量冲突,执行效率比多线程高很多

Golang 的协程间通讯方式有哪些?

  • 共享内存和协程通信

手撕代码

最后一个环节当然是面试者喜闻乐见的手撕代码环节,也是字节面试的传统。

仍然记得字节的面试通知邮件里写着如下内容:

如果有编码的要求,那注意我们需要的是可执行的代码,而不是伪代码。我们面试官普遍都有代码洁癖,良好的代码风格有助于提升你的竞争力。

    //二叉树结构
    public class TreeNode{
        TreeNode left;
        TreeNode right;
        int val;

        public TreeNode(int val){
        this.val = val;
        }
    }

   //函数实现
   public boolean isBST(TreeNode root,int min,int max){
        if(root == null) return true;
        if(root.val > min && root.val < max){
            return (isBST(root.left,min,root.val)&&isBST(root.right,root.val,max));
        }else return false;
    }

    //注意如下方法无法解决特殊情况
    public boolean isBST(TreeNode root){
        if(root == null) return true;
        if(root.val > root.left.val && root.val < root.right.val){
            return (isBST(root.left)&&isBST(root.right));
        }else return false;
    }

   /**
     * 注意特殊情况!
     *
     *         3
     *       /   \
     *     2     5
     *   /  \
     * 1    4
     *
     * 这不是一颗 BST 但是符合所有子树左子节点小于根节点,右子节点答于根节点。
     */

本作品采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0)进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

最后更新于