一種求字符集子集的方法

                  今天一個同學問我:Java中有沒有二進制數據類型,我在Baidu上搜了一下,得到結論Java中的整型變量只有十進制,八進制,十六進制的表示形式。我問這個同學為什么要問這個問題,他告訴我,他在編一個算法時用到二進制轉換問題。他是在為一個字符集求子集。他的算法如下:
                  對于集合{A,B,C,D},它的非空子集個數為2×2×2×2-1,用二進制表示就是1111,我們規定從左到右第1位對應A,第2位對應B,第3位對應C,第4位對應D。如果相應位為1,則表示存在該字符,否則不存在該字符。如1101就表示{A,B,D} 。這樣,對于一個n個字符組成的集合,根據n可以算法它的非空子集個數為m(2的n次冪-1),將m轉換為二進制數,然后采用每次減1的方法,即可得到所有子集。
                 這個時候我才理解同學尋找二進制數據類型的原因,其實我們完全可以在javaAPI中選擇一個能將整型變量轉換為二進制字符串的方法,先將整型變量-1,再轉換為二進制字符串,最后根據二進制字符串就可以得到相應集合的子集。 我在JDK幫助文檔中查到一個方法:Integer類中有一個static方法toBinaryString(int i),這個方法就是將整型i轉換為二進制字符串,這下一切都解決了,代碼如下:

          /*
           *@author 我為J狂 建立日期 2007-4-15
           *
           
          */

          package net.blogjava.lzqdiy;

          public class IntegerToBinary
          {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  
          // TODO Auto-generated method stub
                  int n = 4;
                  
          int m = (int) Math.pow(2, n) - 1;
                  
          for (int i = m; i >= 1; i--)
                  
          {
                      StringBuffer str 
          = new StringBuffer(Integer.toBinaryString(i));

                      
          switch (str.length())
                      
          {
                      
          case 1:
                          str.insert(
          0"000");

                          
          break;
                      
          case 2:
                          str.insert(
          0"00");

                          
          break;
                      
          case 3:
                          str.insert(
          0"0");

                          
          break;

                      
          default:
                          
          break;
                      }

                      System.out.println(str);
                  }

              }

          }

          本算法的輸出是:
          1111
          1110
          1101
          1100
          1011
          1010
          1001
          1000
          0111
          0110
          0101
          0100
          0011
          0010
          0001



          posted on 2007-04-15 12:28 我為J狂 閱讀(2043) 評論(5)  編輯  收藏 所屬分類: Java算法

          評論

          # re: 一種求字符集子集的方法[未登錄] 2007-04-15 23:24 alex

          ....ju ran you zhe me sha d banfa  回復  更多評論   

          # re: 一種求字符集子集的方法 2007-04-16 12:13 我為J狂

          @alex
          朋友,恕我才疏學淺,實在不明白您評論的意思!請您賜教。  回復  更多評論   

          # re: 一種求字符集子集的方法 2011-05-13 19:52 Claude

          他說:居然有這么傻的辦法  回復  更多評論   

          # re: 一種求字符集子集的方法 2011-05-13 19:53 Claude

          我覺得這算法很牛呀,或許他知道更好的算法吧,不過看他這么不淡定,應該不咋地,呵呵  回復  更多評論   

          # re: 一種求字符集子集的方法 2014-04-11 16:33 phenix

          如果這個字符串中有字母重復,該怎么做呢?  回復  更多評論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新乡县| 宣城市| 荃湾区| 含山县| 洛扎县| 丰镇市| 长岛县| 临安市| 章丘市| 呼和浩特市| 资中县| 漳平市| 土默特右旗| 班玛县| 罗平县| 图们市| 旌德县| 东乡族自治县| 稻城县| 青冈县| 柳州市| 榆社县| 双桥区| 喜德县| 桓仁| 大港区| 温州市| 微山县| 新龙县| 荥经县| 丰宁| 华亭县| 云林县| 贵德县| 博乐市| 芒康县| 湘潭县| 洛宁县| 营口市| 南郑县| 枞阳县|