一種求字符集子集的方法

                  今天一個同學問我: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)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 天津市| 高邑县| 仪陇县| 甘孜县| 南陵县| 许昌市| 宜昌市| 琼海市| 开平市| 南康市| 商河县| 杭锦旗| 大名县| 梓潼县| 古田县| 台北县| 泰和县| 紫云| 平昌县| 喀喇沁旗| 类乌齐县| 宁城县| 米易县| 酉阳| 礼泉县| 军事| 祁阳县| 大理市| 虎林市| 鄄城县| 炎陵县| 洱源县| 个旧市| 拜城县| 林周县| 宜君县| 阳新县| 天门市| 抚州市| 威宁| 达孜县|