9 条题解

  • 61
    @ 2023-7-31 19:16:39

    用数组统计字符出现次数

    这道题运用的思想有点像排序算法中的计数排序。都是用数组储存一个东西的出现次数,只不过一个是数字的出现次数,一个是字符的。


    好了不扯了,我们先看题目。题目本身已经很简洁了,那就不简化了,我们先看有什么难点。

    1. 如何统计一个长度为二的字符串的出现次数。
    2. 如何以字典顺序输出(顾名思义,字典顺序就是字典上英语单词的排列顺序)。

    难点一解决:

    • 就像开头说的那样,我们可以从这联想到计数排序的排序方式,聪明的我们马上可以联想到一个解决方法——用数组统计字符出现次数。
    • 这时候问题又来了,怎么统计呢?
    1. 因为是两个字符,我们可以创建一个二维数组来统计一个维度对应一个字符。
    2. 我们可以用一个int变量=char变量-‘a’的方法来将字符转化成数字,于是,我们就有了一个带含义的数组(0代表a,1代表b,以此类推)。
    • 这样问题就解决了。

    难点二解决:

    • 当我们解决了问题一时,便会惊奇的发现,欸,问题而也解决了,就像计数排序一样,从0到25扫一遍,输出,就已经按字典顺序排好了,这就是计数排序的原理。

    总结

    我们总结一下,顺便把前面没说的一些小问题也给说一下。

    1. 运用类似计数排序的方法统计每个字符串出现次数。
    2. 定义一个变量maxn,遍历数组,统计字符串最大出现次数。
    3. 再次遍历数组判断:如果这个数组的数与之前定义的maxn相等,就输出相应的字符串。(不在上一个循环,找到最大之后直接输出,是因为有可能会有多个出现次数相等的字符串)。
    4. 程序结束。

    AC代码(解析在注释中)

    #include <bits/stdc++.h>
    using namespace std;
    int a[30][30],num;
    int main()
    {
        string s;
        cin>>s;
        num=s.length();
        char z;//用以进行数字与字符串之间的转换。
        for (int i=0;i<num-1;i++)
        {
            a[s[i]-'a'][s[i+1]-'a']++;
        }//统计字符串出现次数。
        int maxn=-1;
        for (int i=0;i<=25;i++)
        {
            for (int i2=0;i2<=25;i2++)
            {
                if (a[i][i2]>maxn)
                {
                    maxn=a[i][i2];
                }//如果这个字符串更大就更新maxn。
            }
        }//一个字符串最多出现几次。
        for (int i=0;i<=25;i++)
        {
            for (int i2=0;i2<=25;i2++)
            {
                if (a[i][i2]==maxn)
                {
                    z=i+'a';
                    cout<<z;
                    z=i2+'a';
                    cout<<z<<endl;
                }//如果他与字符串出现最大次数相等,就将数字转化为字符,并输出。
            }
        }//输出答案。
        return 0;
    }
    

    如果对你有帮助,那就点个赞吧,迄今我已经写了六七篇题解,但是一个别人点的赞都没有,全是我自己点的一个赞[大哭][大哭]。

    • 6
      @ 2021-8-7 13:51:27

      假设题目是统计字母出现的次数,我们很容易想到使用一个带含义的一维数组a,来记录每个字母出现的次数,那么a[0]表示字母a出现的次数,a[1]表示字母b出现的次数……a[25]表示字母z出现的次数。

      那么如果统计两个字母组成的字母对,我们完全可以使用一个二维数组a,a[0][0]表示字母对aa出现的次数,a[0][1]表示字母对ab出现的次数……a[25][25]表示字母对zz出现的次数,这样我们就可以用一个二维数组来表示所有字母对出现的次数,找出最大值,然后判断和最大值相等的字母对是哪些,输出这个字母对即可。

      字母转数字:用一个整型变量=字符-'a'即可得到所对应的数字,比如字符是z,那么字符-'a'即可得到25。

      数字转字母:最后的输出我们需要将数组的下标再转回字母输出,同样的方法,我们可以定义一个字符型变量,让这个变量=数字+'a'即可,比如下标是3,转成的字母就是'a'+3也就是d。

      具体代码如下:

             cin >> s;
      	for(int i=0; i<s.length()-1; i++) //注意是length-1,不要越界 
      	{
      		a[s[i]-'a'][s[i+1]-'a']++;
      	}
      	for(int i=0; i<26; i++)
      		for(int j=0; j<26; j++)
      			maxx = max(maxx,a[i][j]);
      	for(int i=0; i<26; i++)
      		for(int j=0; j<26; j++)
      			if(a[i][j] == maxx)
      			{
      				x = 'a' + i;
      				y = 'a' + j;
      				cout << x << y << endl;
      			}	
      
      • 3
        @ 2023-9-29 16:58:24

        方法类似于计数排序,要注意 'a'化为int型为97

        #include <iostream>
        #include <string>
        using namespace std;
        string s;
        int c[30][30]; //用二维数组统计字母组合出现次数
        int ans=-1;
        int main()
        {
            cin >>s;
            for (int i=1;i<s.size();i++)
            {
                int x=s[i-1]-96;
                int y=s[i]-96;
                c[x][y]++;
            }
            for (int i=1;i<=26;i++)
            {
                for (int j=1;j<=26;j++)
                {
                    if(c[i][j]>ans)
                    {
                        ans=c[i][j];
                    }
                }
            }
            for (int i=1;i<=26;i++)
            {
                for (int j=1;j<=26;j++)
                {
                    if(c[i][j]==ans)
                    {
                        char a=i+96;
                        char b=j+96;
                        cout << a << b << endl;
                    }
                }
        
            }
            return 0;
        }
        
        • 2
          @ 2023-6-7 22:29:09

          枚举所有组合,求最大

          #include<bits/stdc++.h>
          using namespace std;
          long long a[30][30],maxx;
          int main()
          {
              string s;
              cin>>s;
              for (int i=0;i<s.length()-1;i++)
                  a[s[i]-'a'+1][s[i+1]-'a'+1]++;
              for (int i=1;i<=26;i++)
                  for (int j=1;j<=26;j++)
                      maxx=max(maxx,a[i][j]);
              for (int i=1;i<=26;i++)
                  for (int j=1;j<=26;j++)
                      if (a[i][j]==maxx)
                      {
                          char x='a'+i-1,y='a'+j-1;
                          cout<<x<<y<<'\n';
                      }
              return 0;
          }
          • @ 2024-4-28 16:24:56

            化简后······

            #include<bits/stdc++.h>
            using namespace std;
            long long a[30][30],maxx,i,j;
            int main(){
            string s;cin>>s;
            for(i=0;i<s.length()-1;i++)a[s[i]-'a'+1][s[i+1]-'a'+1]++;
            for(i=1;i<=26;i++)for(j=1;j<=26;j++)maxx=max(maxx,a[i][j]);
            for(i=1;i<=26;i++)for(j=1;j<=26;j++)if(a[i][j]==maxx){char x='a'+i-1,y='a'+j-1;cout<<x<<y<<'\n';}
            return 0;
            }
            
        • 1
          @ 2023-9-30 15:59:14

          100分题解

          #include
          using namespace std;
          string s;
          char c[100001][2];
          int a[129][129],mx;
          int main()
          {
              cin >> s;
              for (int i = 1;i < s.length();i++)
              {
                  a[s[i - 1]][s[i]]++;
                  mx = max(mx,a[s[i - 1]][s[i]]);
              }
              for (int i = 'a';i <= 'z';i++)
              {
                  for (int j = 'a';j <= 'z';j++)
                  {
                      if (a[i][j] == mx)
                      {
                          cout << char(i) << char(j) << endl;
                      }
                  }
              }
              return 0;
          }
          
          
          
          • -1
            @ 2023-10-7 12:29:17
            #include <bits/stdc++.h>
            using namespace std;
            string s;
            int maxx=-1;
            int a[30][30];
            int main(){
            	cin>>s;
            	int len=s.length();
            	for (int i=0;i<len-1;i++){
            		a[s[i]-'a'][s[i+1]-'a']++;//计数排序是统计两位字符转换 
            	}
            	for (int i=0;i<26;i++){//因为只有a~z26种情况 
            		for (int j=0;j<26;j++){
            			maxx=max(maxx,a[i][j]);//寻找最大值 
            		}
            	}
            	for (int i=0;i<26;i++){
            		for (int j=0;j<26;j++){
            			if (a[i][j]==maxx){
            				char x=i+'a';//用字符变量转换 
            				char y=j+'a';
            				cout<<x<<y<<endl;//输出 
            			}
            		}
            	}
            	return 0;
            }
            
            • -1
              @ 2021-7-28 12:00:39

              使用二维数组统计所有字符对出现次数即可

              cin >> s;
                  for (int i = 0; i < s.length() - 1; i++)
                  {
                      cnt[s[i] - 'a'][s[i + 1] - 'a']++;
                      maxCnt = max(maxCnt, cnt[s[i] - 'a'][s[i + 1] - 'a']);
                  }
                  for (int i = 0; i < 26; i++)
                      for (int j = 0; j < 26; j++)
                          if (cnt[i][j] == maxCnt)
                              cout << (char)(i + 'a') << (char)(j + 'a') << "\n";
              
              • -6
                @ 2022-10-19 19:19:42
                #include <bits/stdc++.h>
                using namespace std;
                string s;
                int cnt[10005][10005], maxx;
                int main()
                {
                cin >> s;
                for (int i = 0; i < s.length() - 1; i++)
                {
                cnt[s[i] - 'a'][s[i + 1] - 'a']++;
                maxx = max(maxx, cnt[s[i] - 'a'][s[i + 1] - 'a']);
                }
                for (int i = 0; i < 26; i++)
                for (int j = 0; j < 26; j++)
                if (cnt[i][j] == maxCnt)
                cout << (char)(i + 'a') << (char)(j + 'a') << "\n";
                return 0;
                }
                
                • -7
                  @ 2023-2-6 15:29:58

                  写题解请注意

                  鼓励大家写题解,但注意题解格式。

                  题解一定要有思路解析或代码注释,能否让别人理解你的思路

                  也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

                  给代码两端加上这个会舒服一些

                  ```cpp

                  你的代码

                  ```

                  </span>

                  这个点在键盘的左上角tab上面那个键,注意切换输入法

                  #include<iostream>
                  using namespace std;
                  int main()
                  {
                      int n;
                      cin>>n;//这是一个注释
                      return 0;
                  }
                  

                  请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

                  抄袭题解一经发现直接取消成绩。

                  题解被删除的可能

                  1. 代码不符合格式规范
                  2. 没有思路讲解或者没有注释,
                  3. 无意义的题解

                  大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

                  • 1

                  信息

                  ID
                  1187
                  时间
                  1000ms
                  内存
                  256MiB
                  难度
                  5
                  标签
                  递交数
                  914
                  已通过
                  353
                  上传者