设计思想: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 }
截图:
我的总结:
虽然题目有变化,但算法都是相通的。遇到新题目先想一想有没有能够套用的算法,既能解决问题,又能加深对算法的理解和对实际问题的分析能力。