# About Intetview0

## 致谢

把这篇文章献给所有我在[牛客网](https://www.nowcoder.com/discuss)上认识的同学们。

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

## 正文

### 自我介绍

* 自我介绍主要叙述了学校专业，实习经历以及项目经历。
* *自我介绍的时候网络信号不好，所以面试官估计没有听清太多Orz。*

### 项目切入 / Redis / MySQL

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

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

因为小公司项目 Redis 用的是 String 数据结构。[Redis的数据结构](https://3ric.gitbook.io/blog/about-redis#shu-ju-lei-xing-di-ceng)。

**为什么手动淘汰 Redis 中的数据，不使用 Redis 的内存淘汰机制？**

因为 Redis 的内存淘汰机制是对 Key 值进行筛选，而项目中的机制是对 Value 值的筛选。[Redis 内存淘汰机制](https://3ric.gitbook.io/blog/about-redis#nei-cun-tao-tai-ji-zhi)。

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

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

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

* 数据库用的是MySQL。
* [ACID](https://3ric.gitbook.io/blog/about-mysql#shu-ju-ku-de-shi-wu)。
* [隔离级别](https://3ric.gitbook.io/blog/about-mysql#shi-wu-ge-li-ji-bie)。

### 计算机网络 / 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 的协程间通讯方式有哪些？**

* 共享内存和协程通信

### 手撕代码

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

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

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

#### [Leetcode 98](https://leetcode-cn.com/problems/validate-binary-search-tree/)

```java
    //二叉树结构
    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 但是符合所有子树左子节点小于根节点，右子节点答于根节点。
     */
```

## [许可协议](https://3ric.gitbook.io/blog/license)

{% hint style="info" %}
本作品采用[知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0)](https://creativecommons.org/licenses/by-nc-sa/4.0/)进行许可，转载时请注明原文链接，图片在使用时请保留全部内容，可适当缩放并在引用处附上图片所在的文章链接。
{% endhint %}
