找水王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

截图:

我的总结:

      虽然题目有变化,但算法都是相通的。遇到新题目先想一想有没有能够套用的算法,既能解决问题,又能加深对算法的理解和对实际问题的分析能力。

相关文章
相关标签/搜索