邊城愚人

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

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

          /**
          ?*?用1,2,2,3,4,5,這六個數字,用java寫一個main函數,打印出所有不同的排列,如: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;//組合的個數
          ????????int?pos1=1,pos2=2;//該變量為重復的2的數組位置,可以提取出來作為參數
          ????????int?emp?=?countOf2(num,index);//得到當前的數組中有幾個2
          ????????for(int?i=0;i<num.length;i++){
          ????????????
          if(number[i]=='2'){//當前的數字為2
          ????????????????if(emp?>=?2){//數組中2的個數多于2個
          ????????????????????continue;
          ????????????????}
          else?if(emp?==?1){//數組中有一個2時,要求當前的2不能為位置1的2
          ????????????????????if(i==pos1)continue;
          ????????????????}
          else{
          ????????????????????
          if(i==pos2)continue;//數組中沒有2時,要求當前的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;//去除重復數字
          ????????????}

          ????????????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 閱讀(4529) 評論(12)  編輯  收藏 所屬分類: DS&Algorithms

          評論

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

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

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

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

          # re: 一道java算法題 2007-03-13 16:50 LeeYue_0530@hotmail.com
          //不知道我這樣寫算不算 算法
          void arithmetic1()
          {
          /*******
          * 用1,2,2,3,4,5,這六個數字,用java寫一個main函數,打印出所有不同的排列,如: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(
          //循環數字符合數據的判斷
          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;
          }
          }  回復  更多評論
            

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

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

          這段代碼其實永遠跑不到  回復  更多評論
            

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

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

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

          # 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]);
          }
          }
          }
          }
          }
          }
          }
          }
          }  回復  更多評論
            

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

          QQ:185604870  回復  更多評論
            

          主站蜘蛛池模板: 彰化市| 鄂州市| 杭锦后旗| 玉环县| 丹凤县| 葫芦岛市| 元朗区| 嘉荫县| 微山县| 新龙县| 绥宁县| 平江县| 星子县| 安新县| 上林县| 曲周县| 噶尔县| 洞头县| 轮台县| 长丰县| 肃南| 绍兴市| 商南县| 涞水县| 许昌市| 宕昌县| 龙海市| 蓬安县| 东乡| 陈巴尔虎旗| 民和| 岫岩| 寻甸| 冀州市| 读书| 定结县| 云安县| 高安市| 宁河县| 库尔勒市| 望谟县|