設計思想: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 }
截圖:
我的總結:
雖然題目有變化,但算法都是相通的。遇到新題目先想一想有沒有能夠套用的算法,既能解決問題,又能加深對算法的理解和對實際問題的分析能力。