天天看點

課堂練習-找水王

題目:三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。

        如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?

解題思路:根據課堂上的讨論,設計應為時間複雜度為O(n)。采用消除法來對問題求解:相鄰兩個ID若不同即消除,留在最後的一定是水王ID(題目中“發帖數目超過了文章數目的一半”非常重要)。程式中給出的ID賬号假定為10個。

程式代碼:

#include<iostream.h>
int main()
{
    int a[10];
    cout<<"請輸入10個id賬号:"<<endl;
    for (int k=0;k<10;k++)
    {
        cin>>a[k];
    }
    int temp=a[0];
    int j=1;
    for (int i=1;i<10;i++)
    {    
        if(a[i]==a[0])
            j++;                
        else    
            j--;
        if(j==0)
        {
            temp=a[i+1];
            j=1;
        }
    }
        cout<<"水王的賬号id為:"<<temp<<endl;
        return 0;
}      

程式截圖:

課堂練習-找水王
課堂練習-找水王
課堂練習-找水王

思考總結:

   在設計程式中,首先想到的是判斷相鄰倆ID是否相同,以此為首要條件進行程式設計。但是并沒有達到Id相消的效果,結果越做越亂。打破思維之後,考慮到使用計數的方法。以基數為1、第一個ID為基礎,相同累加,不同累減,當其為0時,得出此數相消。在程式的失敗中,又重新加深了C的基礎語言程式設計能力,程式成功後,代碼也并不是想象之中的那麼難。隻是沒有想到恰當的方法。