每日两题 T13

时间:2022-07-22
本文章向大家介绍每日两题 T13,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

算法

LeetCode T289. 生命游戏[1]

描述

根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;2.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;4.如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

示例1

输入:
[
  [0,1,0],
  [0,0,1],
  [1,1,1],
  [0,0,0]
]
输出:
[
  [0,0,0],
  [1,0,1],
  [0,1,1],
  [0,1,0]
]

分析

这道题题意是:扫描一个数字,看他附近的8个元素(可能没有8个),分别对应以上列出的4个条件,更新数字。

代码

var gameOfLife = function(board) {
    let row = board.length;
    let col = board[0].length;
    let helper = function(ro,co,copy){
        let count = 0
        if(ro > 0) {
          count += copy[ro-1][co]
          if(co > 0) {
            count += copy[ro-1][co-1]
          }
          if(co < col-1) {
            count += copy[ro-1][co+1]
          }
        }
        if(ro < row - 1) {
          count += copy[ro+1][co]
          if(co > 0) {
            count += copy[ro+1][co-1]
          }
          if(co < col-1) {
            count += copy[ro+1][co+1]
          }
        }
        if(co > 0) {
          count += copy[ro][co-1]
        }
        if(co < col-1) {
          count += copy[ro][co+1]
        }
        //根据状态进行归类,true为状态变化的,即死变活,活变死
        if(copy[ro][co] == 1){
           if(count < 2) {
               return true;
           }else if(count > 3) {
               return true;
           }
        }
        if(copy[ro][co] == 0&&count == 3) return true;
        return false;
    }
    let copy = JSON.parse(JSON.stringify(board));
    for(let i = 0;i<row;i++){
        for(let j = 0;j<col;j++){
            if(helper(i,j,copy)){
                //直接通过异或运算变更状态
                board[i][j]^=1
            }
        }
    }
};

前端

说说HTTPS原理及握手过程

概念

HTTP 是运行在 TCP 层之上的,而 HTTPS 则是在 HTTP 和 TCP 层直接多加了一个 SSL/TSL 层,SSL 层向上提供加密和解密的服务,对 HTTP 来说是透明的。

对称加密与非对称加密

加密和解密都使用同一种算法的加密方法,称之为对称加密。加密和解密使用不同的算法,称为非对称加密

对称加密需要一把钥匙就够了,非对称加密算法需要两把钥匙——公钥和私钥。用公钥加密的密文只能用相应的私钥解开,用私钥加密的密文只能用相应的公钥解开。其中,公钥是公开的,私钥是不对外公开的。

两者的主要区别在于密钥的长度不同,长度越长,相应的加/解密花费的时间就会更长,对称加密使用的密钥长度会短一些。

SSL 结合了这两种加密算法的优点。利用非对称加密算法来协商生成对称加密的密钥,然后之后就用对称加密来进行通信。

client --> server

Client Hello

握手开始时,总是优先客户端会发送 Client Hello 信息给服务端,主要包含

•Version Number:客户端支持的协议版本

•Randomly Generated Data:32 字节长度的随机值,用于之后生成主密钥。

•Session Identification,Session ID,第一次连接时为空。

•Cipher Suite:客户端支持的加密算法列表,按优先级顺序排列。

server --> client

Server Hello

接着,服务端收到客户端发来的消息之后,会返回 Server Hello 信息给客户端,告知客户端接下来使用的一些参数

•Version Number:通信协议版本

•Randomly Generated Data:32 字节长度的随机值,用于之后生成主密钥

•Session Identification:Session ID

•Cipher Suite:加密算法

Server Certificate

服务端还会带上证书返回给客户端。证书中含有服务端的公钥、网站地址、证书的颁发机构等信息。

客户端收到服务端返回的证书之后,会验证该证书的真实合法性。

Server Key Exchange

这个是可选的,取决于使用的加密算法。主要是携带密钥交换的额外数据。

Server Hello Done

表示服务端已经发送完毕,并等待客户端回应。

client --> server

Client Key Exchange

客户端使用之前发送给服务端及服务端返回的随机数,生成预主密钥,然后用服务端返回的公钥进行加密。

Change Cipher Spec

告诉服务端,之后的所有信息都会使用协商好的密钥和算法加密

Client Finished

客户端的握手工作已经完成。这条信息是握手过程中所有消息的散列值。

server --> client

Change Cipher Spec Message

告知客户端,会使用刚刚协商的密钥来加密信息

Server Finished Message

表示服务端的握手工作已经完成

References

[1] 289. 生命游戏: https://leetcode-cn.com/problems/game-of-life/