9 条题解
-
61
用数组统计字符出现次数
这道题运用的思想有点像排序算法中的计数排序。都是用数组储存一个东西的出现次数,只不过一个是数字的出现次数,一个是字符的。
好了不扯了,我们先看题目。题目本身已经很简洁了,那就不简化了,我们先看有什么难点。
- 如何统计一个长度为二的字符串的出现次数。
- 如何以字典顺序输出(顾名思义,字典顺序就是字典上英语单词的排列顺序)。
难点一解决:
- 就像开头说的那样,我们可以从这联想到计数排序的排序方式,聪明的我们马上可以联想到一个解决方法——用数组统计字符出现次数。
- 这时候问题又来了,怎么统计呢?
- 因为是两个字符,我们可以创建一个二维数组来统计一个维度对应一个字符。
- 我们可以用一个int变量=char变量-‘a’的方法来将字符转化成数字,于是,我们就有了一个带含义的数组(0代表a,1代表b,以此类推)。
- 这样问题就解决了。
难点二解决:
- 当我们解决了问题一时,便会惊奇的发现,欸,问题而也解决了,就像计数排序一样,从0到25扫一遍,输出,就已经按字典顺序排好了,这就是计数排序的原理。
总结
我们总结一下,顺便把前面没说的一些小问题也给说一下。
- 运用类似计数排序的方法统计每个字符串出现次数。
- 定义一个变量maxn,遍历数组,统计字符串最大出现次数。
- 再次遍历数组判断:如果这个数组的数与之前定义的maxn相等,就输出相应的字符串。(不在上一个循环,找到最大之后直接输出,是因为有可能会有多个出现次数相等的字符串)。
- 程序结束。
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
假设题目是统计字母出现的次数,我们很容易想到使用一个带含义的一维数组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
方法类似于计数排序,要注意 '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
枚举所有组合,求最大
#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; }
-
1
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
#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
使用二维数组统计所有字符对出现次数即可
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
#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
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1187
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 914
- 已通过
- 353
- 上传者