<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邊城愚人

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

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

    /**
    ?*?用1,2,2,3,4,5,這六個數(shù)字,用java寫一個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;//組合的個數(shù)
    ????????int?pos1=1,pos2=2;//該變量為重復(fù)的2的數(shù)組位置,可以提取出來作為參數(shù)
    ????????int?emp?=?countOf2(num,index);//得到當(dāng)前的數(shù)組中有幾個2
    ????????for(int?i=0;i<num.length;i++){
    ????????????
    if(number[i]=='2'){//當(dāng)前的數(shù)字為2
    ????????????????if(emp?>=?2){//數(shù)組中2的個數(shù)多于2個
    ????????????????????continue;
    ????????????????}
    else?if(emp?==?1){//數(shù)組中有一個2時,要求當(dāng)前的2不能為位置1的2
    ????????????????????if(i==pos1)continue;
    ????????????????}
    else{
    ????????????????????
    if(i==pos2)continue;//數(shù)組中沒有2時,要求當(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ì)看,但是我提一個思路就是把一個2替換為其他數(shù)字,最后再替換回來,這樣結(jié)果會多出一半,然后再 去掉一般的結(jié)果,用 。HashMap就可以  回復(fù)  更多評論
      

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

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

    # re: 一道java算法題 2007-03-13 16:50 LeeYue_0530@hotmail.com
    //不知道我這樣寫算不算 算法
    void arithmetic1()
    {
    /*******
    * 用1,2,2,3,4,5,這六個數(shù)字,用java寫一個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時,要求當(dāng)前的2不能為位置2的2
    }

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

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

    # re: 一道java算法題 2007-03-18 20:11 Belle
    如果就這么幾個數(shù)字,幾種算法間并無太大差異。
    但是,如果有100個數(shù)字或更多那就慘了, 遞歸就用不上了 ,會STACK溢出的。
    所以可以 試試一種叫動態(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ù)  更多評論
      

    主站蜘蛛池模板: 国产L精品国产亚洲区久久| 一级毛片视频免费观看| 亚洲一区二区观看播放| 亚洲精品V天堂中文字幕| 18禁亚洲深夜福利人口| 99re6在线精品免费观看| 亚洲精品在线免费观看| 一个人免费视频在线观看www| 九九九精品视频免费| 搜日本一区二区三区免费高清视频| 国产成人久久精品亚洲小说| 亚洲中文字幕无码亚洲成A人片| 亚洲人成影院在线高清| 亚洲av无码片在线观看| 亚洲卡一卡2卡三卡4麻豆| 亚洲综合精品伊人久久| 三年在线观看免费观看完整版中文| 二区久久国产乱子伦免费精品| 四虎国产精品免费永久在线| 日韩人妻一区二区三区免费 | 亚洲成av人片不卡无码久久| 亚洲国产成人久久精品99| 国产大片免费天天看| 久久爰www免费人成| 在线看片无码永久免费视频| 精品免费国产一区二区三区| 亚洲一级片内射网站在线观看| 亚洲欧洲精品成人久久奇米网| 亚洲AⅤ优女AV综合久久久| 亚洲精品国产福利一二区| 亚洲毛片免费观看| 成人免费区一区二区三区| 免免费国产AAAAA片| 成在线人视频免费视频| 日本成年免费网站| 亚洲乱码国产一区三区| 亚洲AV综合永久无码精品天堂| 久久免费福利视频| 亚洲精品tv久久久久| 亚洲AV无码成人精品区日韩| 91精品全国免费观看含羞草|