天天看點

課堂練習-找水王

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

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

解決方法:

     對所面臨的問題進行簡化,由于“水王”發帖數目超過了文章數目的一半,由此可以作為突破口,尋找簡單的方法,來解決,可以将發帖的ID看成一位數組,簡化為,在一位數組中,查找一半以上相同的元素。采用消除法實作,比較簡單,即對相鄰的不同的元素消除,相同的元素,則不消除,并且對num(計數)加1,最終剩下的元素即為索要查找的元素。

代碼:

//找水王
//李妍 20133093
//三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,
//他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。
//要求:如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?
#include<iostream>
using namespace std;
#define N 100

int main()
{
    int Water_King = 0; //用來标記水王
    int num = 0;  //記錄消除後的次數
    int num_tiezi = 0;//記錄文章的數目
    int Tie[N];

    while (num_tiezi == 0)//如果數組長度為零則請重新輸入
    {
        cout << "請輸入文章的數目:";
        cout << endl;
        cin >> num_tiezi;
    }
    cout << "輸入文章ID:" << endl;
    for (int i = 0; i <= (num_tiezi - 1); i++)
    {
        cout << "("<<i+1<<"):";
        cin >> Tie[i];
        cout << endl;
        if (Tie[i] == 0)
        {
            cout << "ID不能為0,請重輸:";
            cout << "(" << i + 1 << "):";
            cin >> Tie[i];
            cout << endl;
        }

    }
    for (int i = 0; i<num_tiezi; i++)
    {
        if (num == 0)//初始時,把數組第一個元素賦給Water_King,如果num為0,代表前i-1個中元素兩兩消完,重新指派
        {
            Water_King = Tie[i];
            num = 1;
        }
        else
        {
            if (Water_King == Tie[i]) //相等不消除
                num++;
            else
                num--;
        }
    }
    cout << "水軍的ID是:" << Water_King << endl;
    return 0;
}      

測試結果:

試驗總結:該實驗解決的方法有很多種,考慮到時間的複雜度,選用該方法,能夠将時間複雜度降到最小,同時代碼實作起來,也比較簡單。同時采用這種方法,能夠為以後解決問題,提供了另一種不同的思路。

時間記錄日志:

課堂練習-找水王