一種求字符集子集的方法

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

          /*
           *@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狂 閱讀(2050) 評論(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

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

          <2014年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導航

          統(tǒng)計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 广饶县| 新昌县| 呼图壁县| 合川市| 邛崃市| 射洪县| 金华市| 德格县| 微山县| 府谷县| 周口市| 中西区| 金华市| 保康县| 申扎县| 乌鲁木齐市| 邻水| 峨眉山市| 涿鹿县| 曲沃县| 和硕县| 前郭尔| 疏附县| 色达县| 西丰县| 大姚县| 蒲城县| 资中县| 鱼台县| 五原县| 志丹县| 高青县| 文山县| 绩溪县| 阿坝县| 中超| 平江县| 尼勒克县| 佳木斯市| 乐昌市| 洛川县|