找水王2

    • 隨着論壇的發展,管理員發現水王沒有了,可是統計結果代表,有三個發帖不少的ID。據統計他們的發帖數量超過了1/4,你能從發帖列表中快速找到他們嗎?

設計思想:ios

下面是找水王1的設計思想:算法

     這是一個查找數組中出現頻率最高值的問題,不同的是已知條件中有一點爲出現頻率最高值出現頻率大於0.5。數組

     按照常規思路能夠逐個統計出現過的每一個ID出現過的次數。本次做業要求新思路,即ide

          1.計第一個shuiwangId=ID[0]出現過Times=1次;ui

          2.遍歷下一個ID,若是跟shuiwangId相同,Times++,不然,Times--。若是nTimes == 0,重複第一步;spa

          3.遍歷結束,shuiwangId就是水王ID。設計

      此次與之不一樣的是,水王數量變成了3個。上述算法仍可延續,但需作修改,因爲三個水王相互之間不衝突,故可定義三個水王,再與其它ID相抵消。code

具體思路以下:blog

      1.設三個水王ID:shuiwang一、shuiwang二、shuiwang3個出現過度別Times1=Times2=Times3=0次;string

      2.遍歷下一個ID並與三個水王ID比較,若是跟shuiwangN相同,TimesN++,不然,Times一、Times二、Times3均減一。

      3.若是某一shuiwangN出現的次數TimesN==0而且當前遍歷的ID與之不一樣,將當前遍歷的ID設爲這一shuiwangN的ID,並使TimesN=1。繼續第二步,直到遍歷結束。

      4.遍歷結束,shuiwang一、shuiwang二、shuiwang3分別是三個水王的ID。

代碼:

 1 #include<iostream>
 2 #include<fstream>
 3 #include<string>
 4 using namespace std;
 5 int main()
 6 {
 7     ifstream IDFile("ID.txt");
 8     string buffer;
 9     string shuiwang1 = "";
10     string shuiwang2 = "";
11     string shuiwang3 = "";
12     int IdNum = 0;;
13     int Times1 = 0;
14     int Times2 = 0;
15     int Times3 = 0;
16     cout << "ID列表:";
17     for (;;)
18     {
19         if (IDFile.eof())
20         {
21             break;
22         }
23         IDFile >> buffer;
24         IdNum += 1;
25         cout << endl << buffer;
26         if (shuiwang1 == buffer)
27         {
28             Times1 += 1;
29         }
30         else if (shuiwang2 == buffer)
31         {
32             Times2 += 1;
33         }
34         else if (shuiwang3 == buffer)
35         {
36             Times3 += 1;
37         }
38         else if (Times1 == 0)
39         {
40             Times1 += 1;
41             shuiwang1 = buffer;
42         }
43         else if (Times2 == 0)
44         {
45             Times2 += 1;
46             shuiwang2 = buffer;
47         }
48         else if (Times3 == 0)
49         {
50             Times3 += 1;
51             shuiwang3 = buffer;
52         }
53         else
54         {
55             Times1 -= 1;
56             Times2 -= 1;
57             Times3 -= 1;
58         }
59     }
60     IDFile.close();
61     cout << endl << "" << IdNum << "貼。" << endl << endl << "水王1ID:" << shuiwang1 << endl << "水王2ID:" << shuiwang2 << endl << "水王3ID:" << shuiwang3 << endl;
62     return 0;
63 }
View Code

截圖:

我的總結:

      雖然題目有變化,但算法都是相通的。遇到新題目先想一想有沒有能夠套用的算法,既能解決問題,又能加深對算法的理解和對實際問題的分析能力。

相關文章
相關標籤/搜索