js实现格雷编码

格雷码简介

       在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。如下:

js实现格雷编码_第1张图片

表一 格雷码表


LeetCode算法题

原题链接请点击这里

js实现格雷编码_第2张图片

解法一:利用递归

js实现格雷编码_第3张图片
最左边的数字的0和1是对称的,最右边的数字也只是加上前一个输出以及其对称而已。源代码:
export default (n)=>{
  let res = []; //存储最终的结果,将二进制字符串转换为十进制
  let encode = (num)=>{
    if(num==1){
      return [0,1];
    }else{
      let result = [];
      let max = Math.pow(2,num)-1;
      let prev = encode(num-1);
      for(let i=0;i<prev.length;i++){
        result[i] = `0${prev[i]}`;
        result[max-i] = `1${prev[i]}`
      }
      return result;
    }
  }
  encode(n).forEach(item => {
    res.push(item.parseInt(item,2));
  });

  return res;
}

结果:

js实现格雷编码_第4张图片

解法二:找规律(最优)
源自LeetCode的大神:

js实现格雷编码_第5张图片

源代码:

var grayCode = function(n) {
  let result = [];
  for(var i=0;i<Math.pow(2,n);i++){
    result[i] = i ^ (i/2);
  }
  return result;
};

结果:

js实现格雷编码_第6张图片

你可能感兴趣的:(算法)