首页 > 代码库 > 蓝桥杯_算法训练_字串统计

蓝桥杯_算法训练_字串统计

技术分享

技术分享

其实题目已经给的很清楚了,枚举所有的情况,统计出现次数,找到符合条件的结果。

那么我们就根据这个提示完成即可:

第一步:枚举所有可能的字串:

 1 #include<iostream>
 2 #include<string.h> 
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     char s[61];            //存放原来的字符串 
 8     char a[61][61];        //存放所有可能的字串
 9     int i=0,j=0,r=0;
10     
11     cin>>n;
12     cin>>s;//输入原来的字符串
13     
14     while(1)
15     {
16         while(j<n)    //n个一赋值 
17         {
18             a[i][j] = s[r];
19             j++; 
20             r++;
21         }
22         a[i][j] = \0;//问题所在处 
23         if(i==strlen(s)-n && j==n)        break;//当记录到最后一个字符的时候,说明记录已完毕
24         j = 0;
25         r = r - n + 1;
26         i++;
27     } 

这里面最初我是出现了一点小问题的:也就是上面代码中我注释的那个“问题所在处”。没有给每个字符串后面加‘\0’,这就相当于没有终止该字符串。当时调试程序的时候是有问题的。给大家看一个例子:

技术分享

我当时设置了两个地方的输出,然后程序给我的回应就是上面的东西,表示很郁闷啊。还好发现了错误并且进行了改正。

 代码不需要额外解释,注释还是比较详细的。

第二步:统计出现次数

 1 /*统计个数*/
 2     int num[61] = {0};
 3     char temp = 0;
 4     for(j = 0; j <= i; j++)
 5     {
 6         for(r = j+1; r <= i; r++)
 7         {
 8             if(strcmp(a[j],a[r])==0)
 9             {
10                 num[j]++;
11                 a[r][0] = temp;//给首位赋一个数字,使其绝对不会成为最大次数的竞争对手 
12                 temp = temp+1;
13             }
14         }
15     }

 

  我的想法是:之前已经枚举了所有的情况,那就统计一下对应的出现次数,一遍一遍的刷,但是在刷的过程中,要注意的是,需要将重复的字串计数之后进行一下处理,我的做法是,将字串的首位变成数字,这样就可以保证至少自己人不会和自己人杠上,也就是说同一个字串不会抢夺第一的位置。

  这里面需要说明的是代码第11和12行:起初设置的时候,我将首位直接设置成了‘0’,但是发现可能会出现首字母为‘0’的字符串才是最多的,因为很多字串可能就是首字母不同,如果我全部设置成‘0’,那就给了他们相同的机会,所以我做了改动,让临时变量temp随着统计发生变化,本来想用随机数什么的,但是这里因为是字符的处理,随机数可能还是有些麻烦的。

第三步:找到最终结果:

  我们需要的是出现次数最多的字串,如果有相同次数的,选择最长的字串,如果还是很多个,选择最早的那个,这个还是比较好控制的。

 1 /*进行数字的比较,确定出现次数最多的那个*/
 2     int max = 0;//记录下标的变量 
 3     for(r = 1; r <= i; r++)
 4     {
 5         if(num[max]<num[r])
 6         {
 7             max = r;
 8         }
 9         else if(num[max]==num[r])//出现次数一样多 ,找最长的那个 
10         {
11             if(strlen(a[max]) < strlen(a[r]))
12             {
13                 max = r;
14             }
15         }
16      } 
17      //此时max就是我们寻找的那个下标
18      cout<<a[max]; 

 

不到之处还希望大家批评指正,在此谢过!20:06:39   2017-08-13

蓝桥杯_算法训练_字串统计