邊城愚人

          如果我不在邊城,我一定是在前往邊城的路上。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks
          ??? 網(wǎng)上看到一道java算法題,題目如下: 用1,2,2,3,4,5,這六個(gè)數(shù)字,用java寫一個(gè)main函數(shù),打印出所有不同的排列,如:512234,412345等,要求:“4”不能排第3位,“1”與“5”不能相連。
          ??? 我的解題思路是這樣的:這是一個(gè)典型的遍歷題型,可以用遞歸實(shí)現(xiàn)。在每一次遞歸中,要解決的問題包括,“4”不能排第3位,“1”與“5”不能相連,“2”的個(gè)數(shù)最多為2個(gè)且要保證不能重復(fù),其他數(shù)字也要不重復(fù)。最難解決的就是要使“2”不重復(fù),我假定兩個(gè)2的順序不變,也就是在排列組合中兩個(gè)2始終保持一種出現(xiàn)順序,這樣就不會(huì)重復(fù)。其他的約束看一下注釋就可以明白了。網(wǎng)上有個(gè)使用圖的解法,盡管很有創(chuàng)意,但原理性差不多,而使用TreeSet的方法頗讓人跌眼鏡。Java代碼如下:
          package?test;

          /**
          ?*?用1,2,2,3,4,5,這六個(gè)數(shù)字,用java寫一個(gè)main函數(shù),打印出所有不同的排列,如:512234,412345等,要求:“4”不能排第3位,“1”與“5”不能相連。
          ?*?
          @author?kafka0102
          ?*
          ?
          */

          public?class?ATest?{

          ????
          private?static?boolean?is1Or5(char?a,char?b){
          ????????
          if(a=='1'?&&?b=='5')return?true;
          ????????
          if(a=='5'?&&?b=='1')return?true;
          ????????
          return?false;
          ????}

          ????
          ????
          private?static?int?countOf2(char[]?num,int?index){
          ????????
          int?n=0;
          ????????
          for(int?i=0;i<index;i++){
          ????????????
          if(num[i]=='2')n++;
          ????????}

          ????????
          return?n;
          ????}

          ????
          ????
          private?static?boolean?hasSameNumber(int?index,char?a,?char[]?num){
          ????????
          for(int?i=0;i<index;i++){
          ????????????
          if(num[i]==a)return?true;
          ????????}

          ????????
          return?false;
          ????}

          ????
          ????
          public?static?int?testArrange(char[]?number,char[]?num,int?index){
          ????????
          int?size?=?0;//組合的個(gè)數(shù)
          ????????int?pos1=1,pos2=2;//該變量為重復(fù)的2的數(shù)組位置,可以提取出來作為參數(shù)
          ????????int?emp?=?countOf2(num,index);//得到當(dāng)前的數(shù)組中有幾個(gè)2
          ????????for(int?i=0;i<num.length;i++){
          ????????????
          if(number[i]=='2'){//當(dāng)前的數(shù)字為2
          ????????????????if(emp?>=?2){//數(shù)組中2的個(gè)數(shù)多于2個(gè)
          ????????????????????continue;
          ????????????????}
          else?if(emp?==?1){//數(shù)組中有一個(gè)2時(shí),要求當(dāng)前的2不能為位置1的2
          ????????????????????if(i==pos1)continue;
          ????????????????}
          else{
          ????????????????????
          if(i==pos2)continue;//數(shù)組中沒有2時(shí),要求當(dāng)前的2不能為位置2的2
          ????????????????}

          ????????????}
          else{
          ????????????????
          if(index==2?&&?number[i]=='4')continue;//去除4
          ????????????????if(index>0?&&?is1Or5(num[index-1],number[i]))continue;//去除相鄰的1和5
          ????????????????if(hasSameNumber(index,number[i],?num))continue;//去除重復(fù)數(shù)字
          ????????????}

          ????????????num[index]?
          =?number[i];
          ????????????
          if(index==5){
          ????????????????System.out.println(num);
          ????????????????size
          ++;
          ????????????}
          else{
          ????????????????size?
          =?size?+?testArrange(number,num,index+1);
          ????????????}

          ????????}

          ????????
          return?size;
          ????}

          ????
          ????
          public?static?void?aTest(){
          ????????
          char[]?number?=?{'1','2','2','3','4','5'};
          ????????
          char[]?num?=?new?char[number.length];
          ????????
          int?size?=0;
          ????????size?
          =?testArrange(number,num,0);
          ????????System.out.println(
          "size="+size);
          ????}

          ????
          ????
          public?static?void?main(String[]?args)?{
          ????????aTest();
          ????}


          }

          posted on 2007-03-13 09:06 kafka0102 閱讀(4527) 評論(12)  編輯  收藏 所屬分類: DS&Algorithms

          評論

          # re: 一道java算法題 2007-03-13 10:24 lang
          多搞點(diǎn)這樣 的題出來 研究研究,總是 看什么 hibernate頭都銹 了  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-13 12:14 ronghai
          我沒有仔細(xì)看,但是我提一個(gè)思路就是把一個(gè)2替換為其他數(shù)字,最后再替換回來,這樣結(jié)果會(huì)多出一半,然后再 去掉一般的結(jié)果,用 。HashMap就可以  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-13 13:00 kdboy
          生成所有可能的序列,然后再過濾掉不符合要求的。
          效率可能低點(diǎn),不過,這樣應(yīng)該更容易些。  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-13 16:03 kafka0102
          我本身也不會(huì)多少算法題,我想的是,這樣的題要求的是實(shí)現(xiàn)技巧,而不單單是結(jié)果。這道題蠻可以for循環(huán)嵌套,將得到的每一個(gè)排列放到Set中讓Set過濾,但這樣效率極低,而且Set如果自己實(shí)現(xiàn)(比如TreeSet)也很復(fù)雜。做了這么多年Java,感覺就是基本的數(shù)據(jù)結(jié)構(gòu)還行,算法方面就差很多(也許沒有使用機(jī)會(huì)吧),但算法是很基礎(chǔ)的東西,值得好好學(xué)習(xí)。  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-13 16:50 LeeYue_0530@hotmail.com
          //不知道我這樣寫算不算 算法
          void arithmetic1()
          {
          /*******
          * 用1,2,2,3,4,5,這六個(gè)數(shù)字,用java寫一個(gè)main函數(shù),打印出所有不同的排列,如:512234,412345等,要求:“4”不能排第3位,“1”與“5”不能相連。
          * @author kafka0102
          *
          */
          char[] numbers = {'1','2','2','3','4','5'};
          int startNum = 122345;
          int endNum = 543221;

          for(int i = startNum ; i < endNum ;i++)
          {
          String tmpNumber = String.valueOf(i);
          if(
          //循環(huán)數(shù)字符合數(shù)據(jù)的判斷
          tmpNumber.indexOf("1") != -1
          && tmpNumber.indexOf("3") != -1
          && tmpNumber.indexOf("4") != -1
          && tmpNumber.indexOf("5") != -1
          && countOf2(tmpNumber,'2')
          //符合要求:“4”不能排第3位
          && tmpNumber.indexOf("4") != 2
          //符合要求:“1”與“5”不能相連判斷
          && tmpNumber.indexOf("1")+1 != tmpNumber.indexOf("5")
          && tmpNumber.indexOf("5")+1 != tmpNumber.indexOf("1")
          )
          {
          System.out.println(tmpNumber);
          }
          }
          }
          boolean countOf2(String s,char c)
          {
          int count = 0;
          for(int i = 0 ; i < s.length() ; i++)
          {
          if(c == s.charAt(i))
          {
          count++;
          }
          }
          if(count == 2)
          {
          return true;
          }
          else
          {
          return false;
          }
          }  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-13 19:33 踏雪赤兔
          看上去沒多少算法味哦~  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-14 10:56 key
          }else{
          if(i==pos2)continue;//數(shù)組中沒有2時(shí),要求當(dāng)前的2不能為位置2的2
          }

          這段代碼其實(shí)永遠(yuǎn)跑不到  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-14 11:02 key
          @key
          看錯(cuò)了…… 能跑到  回復(fù)  更多評論
            

          # re: 一道java算法題 2007-03-18 20:11 Belle
          如果就這么幾個(gè)數(shù)字,幾種算法間并無太大差異。
          但是,如果有100個(gè)數(shù)字或更多那就慘了, 遞歸就用不上了 ,會(huì)STACK溢出的。
          所以可以 試試一種叫動(dòng)態(tài)算法——也可以說是一種反遞歸,TOPCODE上經(jīng)常用的一種。  回復(fù)  更多評論
            

          # re: 一道java算法題 2008-07-08 16:30 ??
          高手!  回復(fù)  更多評論
            

          # re: 一道java算法題[未登錄] 2008-09-08 10:40 落葉
          我還很興趣試了試,你們幫忙看看

          int count=0;
          String[] arr={"1","2","2","3","4","5"};
          for(int i=0;i<6;i++){
          for(int j=0;j<6;j++){
          for(int m=0;m<6;m++){
          for(int n=0;n<6;n++){
          for(int p=0;p<6;p++){
          for(int q=0;q<6;q++){
          if(i!=j&&i!=m&&i!=n&&i!=p&&i!=q&&j!=m&&j!=n&&j!=p&&j!=q&&m!=n&&m!=p&&m!=q&&n!=p&&n!=q&&p!=q){
          if(m!=4){ // "4"不能排第三位
          if(i-j!=5&&j-i!=5&&j-m!=5&&m-j!=5&&m-n!=5&&n-m!=5&&n-p!=5&&p-n!=5&&p-q!=5&&q-p!=5){ // "1"和"5"不能相連
          System.out.println("第"+(++count)+"種"+arr[i]+arr[j]+arr[m]+arr[n]+arr[p]+arr[q]);
          }
          }
          }
          }
          }
          }
          }
          }
          }  回復(fù)  更多評論
            

          # re: 一道java算法題[未登錄] 2008-09-08 10:42 落葉
          有問題聯(lián)系我,謝謝提出意見哦

          QQ:185604870  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 曲麻莱县| 麻栗坡县| 泌阳县| 黔南| 西畴县| 高邮市| 汶上县| 龙口市| 大连市| 孙吴县| 新巴尔虎左旗| 鸡西市| 舟曲县| 老河口市| 台山市| 突泉县| 循化| 东丰县| 涿州市| 普兰县| 广饶县| 阳春市| 吉木萨尔县| 泽普县| 拜泉县| 蓬安县| 奇台县| 辽阳市| 芜湖市| 剑河县| 蒲城县| 普洱| 疏附县| 本溪| 叶城县| 迭部县| 金川县| 郑州市| 松江区| 张掖市| 永昌县|