小明思考

          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;
              }
          }
          主站蜘蛛池模板: 小金县| 苏尼特左旗| 荥阳市| 呼和浩特市| 西贡区| 宁蒗| 泽州县| 青冈县| 宁明县| 武定县| 广西| 彩票| 同仁县| 英吉沙县| 金平| 灵台县| 仙桃市| 东平县| 信丰县| 汤阴县| 荣昌县| 淮安市| 陵水| 苍山县| 文安县| 平远县| 瓦房店市| 通江县| 拜泉县| 普兰县| 辽阳县| 铜梁县| 墨玉县| 依安县| 湛江市| 新和县| 离岛区| 西藏| 新源县| 于田县| 辛集市|