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

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

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

    邊城愚人

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

      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 閱讀(4527) 評論(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  回復  更多評論
      

    主站蜘蛛池模板: 狠狠入ady亚洲精品| 1区1区3区4区产品亚洲| 美女黄网站人色视频免费| 日韩激情无码免费毛片| 欧美日韩亚洲精品| 免费国产精品视频| 免费夜色污私人影院网站电影| 亚洲国产天堂久久久久久| 国产免费一级高清淫曰本片| 自拍偷自拍亚洲精品被多人伦好爽 | japanese色国产在线看免费| 免费在线精品视频| 特色特黄a毛片高清免费观看| 综合亚洲伊人午夜网| 另类免费视频一区二区在线观看| 久久久久亚洲AV成人无码网站| 日韩插啊免费视频在线观看 | 亚洲视频无码高清在线| 免费看国产成年无码AV片| 亚洲av色香蕉一区二区三区蜜桃| 国产午夜免费福利红片| 羞羞视频免费网站在线看| 亚洲三级电影网址| 成人免费无遮挡无码黄漫视频| 黄页网址在线免费观看| 亚洲国产另类久久久精品| 日本片免费观看一区二区| 久久精品国产亚洲av天美18| 久久久久亚洲?V成人无码| 午夜免费福利视频| 亚洲国产精品成人AV在线| 国内精品久久久久久久亚洲| 222www免费视频| 国产av无码专区亚洲av毛片搜| 亚洲熟妇中文字幕五十中出| 日日麻批免费40分钟日本的| 欧美亚洲国产SUV| 亚洲高清不卡视频| 免费人成视频x8x8入口| ww4545四虎永久免费地址| 男女交性无遮挡免费视频|