leetcode-779-第K个语法符号

254 阅读1分钟

image.png leetcode原题

解题思路

子节点的 k 值如果是奇数,那么它的值和父节点的值是相同的,反之,它的值和父节点的值是相反的

有了以上两个规律的总结,我们思考这样一个过程,从最底层节点向上查找,直到 k = 1,此时,当前节点就是所在行的最最左侧,而所有 k = 1 的节点的值都是 0

那么我们从目标节点,向上回溯,回溯过程中记录 flag 为它和父节点之间的关系

最后回溯到 k = 1 的节点的时候,因为该节点值肯定为 0,则可以根据此时 flag 的状态推导目标节点的值

如果 flag = true,则目标节点和该节点值相同,返回 0,否则返回 1

var kthGrammar = function(n, k) {
  // 初始化 flag 
  let flag = true;
  // 当 k != 1的时候
  while(k>1){
    // 判断当前 k 值奇偶,更新 flag
    if(!(k%2)) flag = !flag;
    // 向上更新 k
    k = Math.ceil(k/2);
  }
  // 根据 flag 结果推导目标字符的值
  if(flag) return 0;
  return 1;
};