蓝桥杯_算法训练_字串统计
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯_算法训练_字串统计相关的知识,希望对你有一定的参考价值。
其实题目已经给的很清楚了,枚举所有的情况,统计出现次数,找到符合条件的结果。
那么我们就根据这个提示完成即可:
第一步:枚举所有可能的字串:
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
以上是关于蓝桥杯_算法训练_字串统计的主要内容,如果未能解决你的问题,请参考以下文章