一種求字符集子集的方法

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

          評論

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

          ....ju ran you zhe me sha d banfa  回復(fù)  更多評論   

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

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

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

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

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

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

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

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

          <2011年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 顺义区| 新昌县| 洛浦县| 辉县市| 永胜县| 潞西市| 潢川县| 定远县| 教育| 临高县| 微博| 开化县| 江永县| 成安县| 越西县| 万年县| 益阳市| 昭苏县| 和林格尔县| 原阳县| 萍乡市| 安多县| 循化| 乌审旗| 辽源市| 喀喇沁旗| 方城县| 巩留县| 都兰县| 澎湖县| 伊宁市| 太湖县| 满洲里市| 本溪| 龙南县| 吴堡县| 厦门市| 子洲县| 青州市| 永城市| 九龙坡区|