直接解题,模仿一遍生成的顺序,直接拿到最后一行,结果发现报错
var kthGrammar = function(n, k) {
// 最后一行生成的数值
let str = '0'
for (let i = 0; i < n; i++) {
str = transform(str).join('')
}
const res = str.split('')
return res[k-1]
};
const transform = (s) =>{
const arr = []
for (let i = 0; i < s.length; i++) {
if (s[i] === '0') {
arr.push('01')
}else if (s[i] === '1'){
arr.push('10')
}
}
return arr
}
换一种思路解
通过Math方法找到当前行的长度,判断找出k值处于前半段还是后半段位置, 如果是后半段位置返回,找出k相对于后半段的位置,在前半段直接去找上一行 后半段位置得到后进行取反
function kthGrammar(n,k) {
if (n === 1) return 0
// 求出行的长度
let leng = Math.pow(2, (n-1))
// 如果K大于长度的一半,就是K所在位置是后半段
if (k > leng/ 2){
// 先得到上一行的值,位置是K相对于后半段的位置
const res = kthGrammar(n-1, k - leng / 2)
// 取反
return res === 0 ? 1 :0
}else {
return kthGrammar(n -1, k)
}
}