这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
67. 格雷编码 (gray-code)
标签
- 文字理解
- 找规律
- 二进制
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。
输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2
对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。
00 - 0
10 - 2
11 - 3
01 - 1
基本思路
规律其实写两个就出来了,要用到上一轮结论,和上一轮结论的倒序。递归。分别在上一轮结论和倒序最高位加 0 、 1就是 本轮结果。
还有一个点就是二进制 n 位上加 1,为什么是 加上 2 ** (n - 1),思考下,这是2进制相关知识。
写法实现
var grayCode = function(n) {
// 递归出口
if (n === 0) return [0]
// 上一轮的 gray 码
const preRes = grayCode(n - 1)
return [...preRes, ...[...preRes].reverse().map(it => it + 2 ** (n - 1))]
};
console.log(grayCode(3))
68. 解码方法 (partition-list)
标签
- dp
- 中等
题目
这里不贴题了,leetcode打开就行,题目大意:
一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
'A' -> 1
'B' -> 2
...
'Z' -> 26
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11" 和 "1"(分别为 "K" 和 "A" )映射为 "KA" 。注意,"06" 不能映射为 "F" ,因为 "6" 和 "06" 不同。
给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。
输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
基本思路
动态规划,如果对此不太了解的请移步这篇 动态规划基本步骤思想
我们还是看三要素
状态表示: dp[i] 表示 0~i子串的解码总数
状态转移方程:
dp[i-1]表示当前字符单独解码的解数
dp[i-2]表示当前字符与前一位结合解码的解数
dp[i] = dp[i-1] + dp[i-2]
边界条件:
dp[0]代表空字符串,只有一种翻译方法,dp[0] = 1- 若第一个字符为
'0',则直接返回0, 否则dp[1] = 1 dp[i-1]的数字在0 ~ 9之间,dp[i-2]的数字在10 ~ 26之间
写法实现
var numDecodings = function(s) {
let len = s.length
if (s[0] === '0') return 0
let dp = new Array(len + 1).fill(0)
// 开头不是 0 的解数为 1 , dp[1] = 1
dp[0] = 1, dp[1] = 1
for (let i = 2; i <= len; i++) {
// 把前一个数,和前两个数截取出来
let [pre1, pre2] = [s.slice(i - 1, i) * 1, s.slice(i - 2, i) * 1]
if (pre1 >= 1 && pre1 <= 9) {
dp[i] += dp[i - 1]
}
if (pre2 >= 10 && pre2 <= 26) {
dp[i] += dp[i - 2]
}
}
return dp[len]
};
另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧