小明思考

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

          日歷

          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          相冊

          My blogs

          搜索

          •  

          最新評論

          格雷碼

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

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

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


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

          對于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;
              }
          }
          主站蜘蛛池模板: 门头沟区| 朔州市| 巴里| 新乐市| 睢宁县| 中宁县| 景德镇市| 宁蒗| 京山县| 育儿| 神池县| 东乌珠穆沁旗| 盘山县| 同江市| 葫芦岛市| 中江县| 清新县| 青川县| 宁远县| 安塞县| 永城市| 钟祥市| 福安市| 象山县| 嘉义县| 曲水县| 郯城县| 昌吉市| 肥西县| 曲沃县| 抚松县| 万山特区| 镇远县| 鄂托克旗| 息烽县| 延庆县| 定远县| 中方县| 汶川县| 独山县| 英吉沙县|