zoukankan      html  css  js  c++  java
  • 蓝桥杯_算法训练_字串统计

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

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

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

     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

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/allein-STR/p/7354584.html
Copyright © 2011-2022 走看看