小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          格雷碼

          Posted on 2013-05-20 21:09 小明 閱讀(2587) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法
          問題格雷碼是一個二進制的編碼系統(tǒng),相鄰的兩個數(shù)只有一位是不同的。
          給定一個非負的整數(shù)n,代表了格雷碼的位的總數(shù)。輸出格雷碼的序列,這個序列必須以0開始。

          比如,給定n=2,輸出[0,1,3,2],格雷碼是
          0 = 00
          1 = 01
          3 = 11
          2 = 10

          注:格雷碼的序列并不是唯一,比如n=2時,[0,2,3,1]也滿足條件。


          分析:
          格雷碼的序列中應(yīng)包含2^n個數(shù)。這個問題初看起來不容易,我們要想出一個生成方法。

          對于n=2,序列是:
          00,01,11,10
          那對于n=3,如何利用n=2的序列呢?一個方法是,先在n=2的四個序列前加0(這其實是保持不變),然后再考慮把最高位變成1,只需要把方向反過來就可以了
          000,001,011,010
          100,101,111,110-> 110,111,101,100
          把這兩行合起來就可以得到新的序列。

          想通了,寫代碼就很容易了。

          public class Solution {
              public ArrayList<Integer> grayCode(int n) {
                  ArrayList<Integer> result = new ArrayList<Integer>();
                  result.add(0);
                  if(n>0){
                      result.add(1);
                  }
                  
                  int mask = 1;
                  for(int i=2;i<=n;++i){
                      mask *= 2;
                      for(int j=result.size()-1;j>=0;--j){
                          int v = result.get(j).intValue();
                          v |= mask;
                          result.add(v);
                      }
                  }
                  return result;
              }
          }
          主站蜘蛛池模板: 通海县| 霍城县| 朝阳区| 信阳市| 八宿县| 合山市| 大城县| 桑植县| 盖州市| 奉节县| 青浦区| 营山县| 黔西| 漳浦县| 瑞昌市| 潜江市| 民县| 石城县| 鹤峰县| 沈丘县| 五莲县| 衡南县| 博兴县| 绥滨县| 家居| 遂宁市| 门头沟区| 高尔夫| 河源市| 常熟市| 东台市| 齐齐哈尔市| 黑河市| 庆城县| 平舆县| 葵青区| 吉林省| 紫阳县| 顺昌县| 新野县| 商都县|