找水王2

    • 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

设计思想:

下面是找水王1的设计思想:

     这是一个查找数组中出现频率最高值的问题,不一样的是已知条件中有一点为出现频率最高值出现频率大于0.5。

     按照常规思路可以逐个统计出现过的每个ID出现过的次数。本次作业要求新思路,即

          1.计第一个shuiwangId=ID[0]出现过Times=1次;

          2.遍历下一个ID,如果跟shuiwangId相同,Times++,否则,Times--。如果nTimes == 0,重复第一步;

          3.遍历结束,shuiwangId就是水王ID。

      这次与之不同的是,水王数量变成了3个。上述算法仍可延续,但需做修改,由于三个水王相互之间不冲突,故可定义三个水王,再与其它ID相抵消。

具体思路如下:

      1.设三个水王ID:shuiwang1、shuiwang2、shuiwang3个出现过分别Times1=Times2=Times3=0次;

      2.遍历下一个ID并与三个水王ID比较,如果跟shuiwangN相同,TimesN++,否则,Times1、Times2、Times3均减一。

      3.如果某一shuiwangN出现的次数TimesN==0并且当前遍历的ID与之不同,将当前遍历的ID设为这一shuiwangN的ID,并使TimesN=1。继续第二步,直到遍历结束。

      4.遍历结束,shuiwang1、shuiwang2、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

截图:

个人总结:

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

posted on 2016-05-27 17:59  狞_JML  阅读(123)  评论(0编辑  收藏  举报

导航