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


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

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

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

     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] = '';//问题所在处 
    23         if(i==strlen(s)-n && j==n)        break;//当记录到最后一个字符的时候,说明记录已完毕
    24         j = 0;
    25         r = r - n + 1;
    26         i++;
    27     } 

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

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

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

    第二步:统计出现次数

     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

  • 相关阅读:
    c#导出导出excel的两种方法
    jsonp跨域访问
    javascrip中部分函数总结
    vue.js开发环境初步搭建、脚手架工具安装(node.js安装)
    Java SE、Java EE、Java ME基本区别
    Ubuntu10.04上apache2: bad user name ${APACHE_RUN_USER}问题解决
    Ubuntu 下安装 webmin1.54
    View的setOnClickListener的添加方法
    android 耳机按钮
    响应键盘事件
  • 原文地址:https://www.cnblogs.com/allein-STR/p/7354584.html
Copyright © 2020-2023  润新知