力扣-第k个语法符号

155 阅读1分钟

直接解题,模仿一遍生成的顺序,直接拿到最后一行,结果发现报错

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
}

image.png

换一种思路解

通过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)
    }
}