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

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

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

    so true

    心懷未來(lái),開創(chuàng)未來(lái)!
    隨筆 - 160, 文章 - 0, 評(píng)論 - 40, 引用 - 0
    數(shù)據(jù)加載中……

    一道筆試題目的自我分析,覺得容易你可以自己先試試看:找出一個(gè)數(shù)組中的次最大元素

    題目:找出一個(gè)數(shù)組中的次最大元素。
    方法一:
    int getSecond(int* ptr,int n)
    {
     int max,second;
     
     second=*ptr;
     max=second;
     for(int i=0;i<n;i++)
     {
      if(*(ptr+i)>max)
      {
       second=max;
       max=*(ptr+i);
      }
      else if(*(ptr+i)<max)
      {
       if(max==second || second<*(ptr+i))
        second=*(ptr+i);
      }
     }


     if(max==second)
      printf("no second number\n");
     else
      printf("the second number is %d\n",second);

     return second;
    }
    該段代碼是用一次循環(huán)來(lái)找出最大值和次最大值。
    核心思想描述如下:
    可以把最大值和次最大值抽象為一個(gè)寶塔模型,比如簡(jiǎn)單的我們用二樓來(lái)表示最大值,一樓

    來(lái)表示次最小值。要注意二樓和一樓不僅僅是一個(gè)二樓比一樓高的問(wèn)題,更重要的是它們緊

    緊相鄰。
    1。首先將max和second均置為數(shù)組中的第一個(gè)數(shù)
    2。接受下一個(gè)數(shù),如果比max大,那么我們很自然會(huì)想到把整個(gè)數(shù)賦給max。但是此刻我們就

    忘記了處理second,其實(shí)忽略這一步的主要原因在于我們沒有清醒的認(rèn)識(shí)到“二樓和一樓緊

    緊相鄰”這層關(guān)系,其實(shí)更新最大值的同時(shí)也就意味著原先的最大值變?yōu)榱水?dāng)前的次最大值

    ,因此需要同時(shí)也更新second=max;然后此次處理結(jié)束,再取出下一個(gè)數(shù)。
    3。如果比max小,那么需要再判斷這個(gè)數(shù)是否比second大,如果大的話,那么就更新second

    的值為當(dāng)前取出的這個(gè)數(shù)。但是這里需要考慮到剛開始初值將max和second賦予了相同的值,

    因此要特別的再加一個(gè)判斷,如果max==second成立,則依然更新second的值,因此可以合寫

    到一個(gè)if語(yǔ)句的判斷中去,然后用“||”連接。
    最后,這個(gè)方法還有個(gè)特別的地方,就是對(duì)于取出的數(shù)等于max時(shí)該如何處理,經(jīng)過(guò)分析可以

    得知,這種情況絕對(duì)不可以簡(jiǎn)單的歸到第2步或第3步之中去,否則會(huì)出大問(wèn)題。因此只能舍

    棄這種情況,因此代碼中用的是else if而不是else。
    ============================================================
    int getSecond(int* ptr,int n)
    {
     int max,second;
     
     max=*ptr;
     for(int i=0;i<n;i++)
      if(*(ptr+i)>max)
       max=*(ptr+i);
     second=max;
     for(i=0;i<n;i++)
      if(*(ptr+i)!=max && *(ptr+i)>second || max==second)
       second=*(ptr+i);

     if(max==second)
      printf("no second number\n");
     else
      printf("the second number is %d\n",second);

     return second;
    }
    這是第二種方法,用兩次for循環(huán)的方法來(lái)實(shí)現(xiàn)同樣的結(jié)果,這就比較容易理解了,第一次

    for循環(huán)找到max,第二次for循環(huán)從剔除了“等于max值”的那些元素的剩余數(shù)組元素中尋找

    “最大值”,但是唯獨(dú)有個(gè)需要注意的地方就是對(duì)于第二次for循環(huán)時(shí)second的初值問(wèn)題,我

    們不可以給second賦一個(gè)我們自己指定的初值,因?yàn)槿绻鹲econd值在算法結(jié)束后依然不變的

    話,我們并不知道second的最終結(jié)果是沒有被改過(guò),還是被數(shù)組中一個(gè)值相同的元素更改過(guò)

    ,因此我們?cè)谒惴ǖ淖詈蠖家袛鄊ax是否等于second,如果等于就是沒有次最大值,如果不

    等于就返回second值。因此,在這里,我們必須把給second賦max初值,這就帶來(lái)一個(gè)問(wèn)題,

    因此在判斷是否更新second的時(shí)候,就要加上這種情況,也就是當(dāng)max==second時(shí),我們依然

    需要更新second的值。

    其實(shí),還有最后一個(gè)問(wèn)題,就是如果沒有second值時(shí),我們是不是不應(yīng)該返回這個(gè)數(shù)啊?如

    果都是自然數(shù),我們可以返回-1以示錯(cuò)誤,但是我們處理的數(shù)組是int型的,因此不能保證其

    中沒有負(fù)值,因此就無(wú)法返回一個(gè)數(shù)值來(lái)表明不存在次最大值,所以我建議讓函數(shù)返回一個(gè)

    bool值,然后在函數(shù)參數(shù)中用一個(gè)int指針來(lái)回傳second值,在調(diào)用該函數(shù)時(shí),可以先判斷返

    回值是否為true,再?zèng)Q定是否利用second值進(jìn)行后續(xù)處理,這樣做也可以在getSecond函數(shù)傳

    參非法時(shí)立即返回false,比如指針為null,或者長(zhǎng)度n為負(fù)數(shù)。

    最后,只有細(xì)心的讀者才能察覺,上面的代碼還不是最優(yōu)的,我們可以將這種方法中的判斷

    改為:if(*(ptr+i)!=max && (*(ptr+i)>second || max==second))

    測(cè)試代碼如下:
    void main()

     int a[]={7,7,7,7,7,6,7,6,7,7,7,7};
     getSecond(a,12);
    }

    posted on 2008-03-08 21:31 so true 閱讀(529) 評(píng)論(0)  編輯  收藏 所屬分類: C&C++

    主站蜘蛛池模板: 久久精品国产亚洲AV不卡| 啦啦啦在线免费视频| 久久精品夜色国产亚洲av| 中文字幕在线观看免费| 在线观看亚洲天天一三视| 老司机精品视频免费| 亚洲av无码国产精品色在线看不卡| 亚洲精品无码高潮喷水A片软| 色视频色露露永久免费观看| 国产亚洲精品仙踪林在线播放| 拔擦拔擦8x华人免费久久| 阿v视频免费在线观看| 亚洲精品人成无码中文毛片| 国产成人无码精品久久久久免费| 亚洲人精品午夜射精日韩| 久久这里只精品国产免费10| 亚洲综合久久成人69| 久久综合AV免费观看| 色偷偷尼玛图亚洲综合| 国产成人精品久久亚洲| 久久国产乱子精品免费女| 亚洲AV成人噜噜无码网站| 免费一级大黄特色大片| 成人久久免费网站| 亚洲大香人伊一本线| 成人免费看黄20分钟| 亚洲天堂免费在线视频| 中文字幕亚洲精品资源网| 毛片基地免费视频a| 一区二区在线免费视频| 亚洲Av无码精品色午夜| 成人性生交大片免费看无遮挡 | 青青草原精品国产亚洲av| 国内精品免费麻豆网站91麻豆| jizzjizz亚洲日本少妇| 亚洲成AV人片在线播放无码| AV无码免费永久在线观看| 无码免费又爽又高潮喷水的视频| 亚洲国产精品免费视频| 手机看片久久国产免费| 久久99精品免费视频|