每日两题 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/
- 使用Symfony的Console组件构建命令行程序
- 微软编程教育都在搞什么?从code.org到makecode,从Minecraft到Micro:bit
- 谷歌:通往完全自动驾驶之路
- 随时随地部署Kubernetes
- 使用CoreOs,Docker和Nirmata来部署微服务风格的应用程序
- 使用ACS和Kubernetes部署Red Hat JBoss Fuse
- 教你快速安装OpenShift容器平台3.6
- 面向开发者的Cloud Foundry
- 云数据库安全与农场和餐馆:知道来源的重要性
- 云数据库安全,农场和餐馆:知道你的来源的重要性
- NO.32 不堪重负:线程池拒绝策略
- 工厂模式进阶之Android中工厂模式源码分析
- C加加游戏编程,大神十年的绝技,正确的入门,这才叫学习
- 我们应该担心吗?人工智能现在可以通过交谈来学习新单词!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【拓展】745- Windows Server 升级 HTTPS 实战
- 【Web技术】746- VSCode 插件开发入门教程
- Python实现ARMA模型
- SpringMVC笔记
- JAVA入门学习五
- ECMAScript 6新特性简介
- Python 多维数据可视化
- 探究Compound治理及构建治理界面
- python之unittest框架实现接口测试的一个简单实例
- linux提权-Suid和Guid配置错误
- Git快速学习
- Spring笔记
- ARL灯塔最新版本2.1,现在它来了,快来看看盒子带来了什么有趣的更新
- 渗透测试常规操作记录(下)
- IntelliJ IDEA 2020.2激活破解教程