25 条题解
-
27
经过百般尝试,我才发现我的 ASCII码搞错了!心态崩溃,好了,看看思路吧!
- 首先建立变量 letter[26] 存储每一个字母出现的次数,顺序是从 a~z,并且每个值都设置为零
- memset函数格式:memset(变量名,每个元素的值,sizeof(变量名));
- 用数组 a 存储输入的字符,用 little 存储 26个字母
- 可以老样子,用 cin.getline(变量名,截取长度,结束符号);
- 然后开始漫长的遍历数组的旅程
- 外层:遍历 26个字母出现的次数
- 内层:遍历数组 a 中的字符是否是遍历的字符,如果是,那么将次数加一
- 最后就是输出结果啦
- 第一行:遍历数组 letter,如果有出现过(!=0)那么输出这个字符
- 第二行:遍历数组 letter,如果有出现过(!=0)那输出出现的次数
呼,终于讲完了,那废话少说,上代码吧!(UP AC过,请放心食用)
#include <bits/stdc++.h> using namespace std; int main() { int letter[26]; memset(letter, 0, sizeof(letter)); char a[300], little[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; cin.getline(a, 300, '.'); for (int i = 0; i < 26; i++) { for (int j = 0; j < strlen(a); j++) { if (a[j] == i + 97) letter[i] += 1; } } for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << little[i]; cout << endl; for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << letter[i]; return 0; }
-
7
使用带含义的数组, 建立一个数组num[27],a代表1,b代表2……z代表26.
输入字符串以后,遍历字符串
不需要写27个if
直接
,就会把对应的字符转成我们需要的数字。
然后输出num数组的时候,在输出
cin >> s; for (int i = 0; i < s.length() - 1; i++) { num[s[i] - 'a' + 1]++; } for (int i = 1; i <= 26; i++) { if (num[i] > 0) { char x = i + 'a' - 1; cout << x; } } cout << endl; for (int i = 1; i <= 26; i++) { if (num[i] > 0) { cout << num[i]; } }
-
5
#include<iostream> using namespace std; int a[100];//定义一个存储字母出现次数的数组 int main() { int x; char b=' '; cin>>b; while (b!='.')//这个循环用来输入和统计 { x=b-'a'+1; a[x]++; cin>>b; } for(int i=1;i<=30;i++)//输出第一行 { if(!(a[i]==0)) { b=i+'a'-1; cout<<b; } } cout<<endl;//不要忘记换行 for(int i=1;i<=30;i++)//输出第二行 { if(!(a[i]==0)) { cout<<a[i]; } } return 0; }//制作不易,求点赞o( ̄▽ ̄)d
-
5
- 首先建立 数组 a 存储每一个字母出现的次数,顺序是从 a~z,并且每个值都设置为零.
- 用 letter 存储输入的字符,用 数组 a 存储 26个字母.
- 然后开始循环输入字母到 n 中.
- 然后开始漫长的遍历数组的旅程:
- 外层:遍历 26个字母出现的次数.
- 内层:遍历数组 a 中的字符是否是遍历的字符,如果是,那么将次数加一.
- 最后就是输出结果啦:
- 第一行:遍历字符串 letter,如果有出现过(!=0)那么输出这个字符.
- 第二行:遍历字符串 a ,如果有出现过(!=0)那输出出现的次数.
AC过,请放心食用
#include <iostream> using namespace std; void aaa(string n) { int a[26]; string letter = "abcdefghijklmnopqrstuvwxyz"; for (int i = 0; i < 26; i++) { a[i] = 0; } for (int i = 0; i < n.length(); i++) { for (int j = 0; j < 26; j++) { if (n[i] == letter[j]) { a[j]++; } } } for (int i = 0; i < 26; i++) { if (a[i] != 0) { cout << letter[i]; } } cout << endl; for (int i = 0; i < 26; i++) { if (a[i] != 0) { cout << a[i]; } } } int main() { string n; cin >> n; aaa(n); return 0; }
-
3
考察了对数组与字符串的应用
好像超了点纲
输入 如何点到即止? 那怎样正确输出? cin getline 不废 ... 仔细想一想
啊哈!先输入,后记录,再判断!
写出来了!!!
#include <bits/stdc++.h> using namespace std; int a[26];//自动初始化 int main(){ string s; string n="abcdefghijklmnopqrstuvwxyz";//26个字母 getline(cin,s,'.');//读到‘.’终止,避免RE for (long long i=0;i<s.size();i++){//遍历 if (!(s[i]>='a' and s[i]<='z')){//判断是否为小写字母 s.erase(s[i]);//删除(尽管没太大用) } } for (int i=0;i<s.size();i++){//从头到尾遍历一遍 for (int j=0;j<26;j++){ if (s[i]==n[j]){//判断s中包函几个不同的几个字母 a[j]++; } } } for (int j=0;j<26;j++){ if (a[j]==0){//判断该字符出现过几次 cout<<"";//如果没有,输出空 } else cout<<n[j];//否则输出该字符 } cout<<endl;//注意换行 for (int j=0;j<26;j++){ if (a[j]!=0){//仍然判断 cout<<a[j];//输出次数 } else cout<<""; } return 0;//好习惯 }
-
1
#include<bits/stdc++.h> using namespace std; map<char,int>a;//map数组,用于char或者string等类型数组的桶标记 char s; int main(){ for(int i=0;;i++){ cin>>s; if(s!='.') a[s]+=1; else if(s=='.') break; }//用于判断什么时候结束输入 for(char i='a';i<='z';i++){ if(a[i]>0) cout<<i; } cout<<endl; for(char i='a';i<='z';i++){ if(a[i]>0) cout<<a[i]; }//for循环里面不仅局限于int类型的计数 return 0; }
-
1
过辣!(不枉我写了10分钟)
初始版本:
#include <bits/stdc++.h> using namespace std; int num[26]; int main(){ string s,a="__________________________";//字符串变量a为26个_ cin>>s; for (int i=0;i<(int)s.length()-1;i++) { int t=s[i]-97; a[t]=s[i]; //'a'的值是97 num[t]++; } for (int i=0;i<26;i++) { if (a[i]!='_') { cout<<a[i]; } } cout<<endl; for (int i=0;i<26;i++) { if (num[i]!=0) { cout<<num[i]; } } return 0; }
稍微优化了一下:
#include <bits/stdc++.h> using namespace std; int num[26];//初始化0 int main() { string s; cin>>s; for (int i=0;i<(int)s.length()-1;i++) { //'a'的值是97 num[s[i]-97]++; } for (int i=0;i<26;i++) { if (num[i]!=0) { char a=i+97; cout<<a; } } cout<<endl; for (int i=0;i<26;i++) { if (num[i]!=0) { cout<<num[i]; } } return 0; }
-
1
感觉这样比较简洁
#include <bits/stdc++.h> using namespace std; int num[27]; int main() { string s; cin >> s; for (int i = 0; i < s.length() - 1; i++) { num[s[i] - 'a' + 1]++; } for (int i = 1; i <= 26; i++) { if (num[i] > 0) { char x = i + 'a' - 1; cout << x; } } cout << endl; for (int i = 1; i <= 26; i++) { if (num[i] > 0) { cout << num[i]; } } return 0; }
-
0
已AC,请放心食用
#include <bits/stdc++.h> using namespace std; int main(int argc,char *argv[]) { char a[100]; int c[26]={0}; cin>>a; for(int i=0;a[i]!='.';i++) { c[a[i]-'a']+=1; } for(int i=0;i<26;i++) { if(c[i]!=0) { cout<<(char)(i+97); } } cout<<endl; for(int i=0;i<26;i++) { if(c[i]!=0) { cout<<c[i]; } } return 0; }
-
0
#include <bits/stdc++.h> using namespace std; int main() { int letter[26]; memset(letter, 0, sizeof(letter)); char a[300], little[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; cin.getline(a, 300, '.'); for (int i = 0; i < 26; i++) { for (int j = 0; j < strlen(a); j++) { if (a[j] == i + 97) letter[i] += 1; } } for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << little[i]; cout << endl; for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << letter[i]; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; int main() { int letter[26]; memset(letter,0,sizeof(letter)); char a[300],little[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; cin.getline(a, 300, '.'); for(int i=0;i<26;i++) { for (int j = 0; j < strlen(a); j++) { if (a[j] == i + 97) letter[i] += 1; } } for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << little[i]; cout << endl; for (int i = 0; i < 26; i++) if (letter[i] != 0) cout << letter[i]; return 0; }
-
0
创建数组,记录后再输出。
#include <iostream> using namespace std; int main() { string s; int a[26]={},i=0; cin>>s; while (s[i]!='.') { if (s[i]>='a' && s[i]<='z') a[int(s[i])-97]++; i++; } for (int i=0;i<26;i++) { if (a[i]>0) cout<<char(i+97); } cout<<endl; for (int i=0;i<26;i++) { if (a[i]>0) cout<<a[i]; } return 0; }
-
0
利用ASCLL码,实现数字与字符之间的转换。
这道题目有两个值得思考的地方。
- 数字与字符如何转换?
- 如何实现字符输出一行,第二行数字对应?
(1)数字与字符转换的方法。
- 字符转数字:如果我们把一个char型字符=int型数字,那么int变量中储存的将是char型字符对应的ASCLL码。
- 数字转字符:其实就是上面的逆运用,反过来即可。
(2)的话,你看完代码就当你明白了。
AC代码
int a[130]={0},zhuan2;//数组下标对应ASCLL码。 string n,dz="",ds=""; cin>>n; char zhuan; int sum=n.length()-1;//保存字符串长度(注:最后的点不能算进去要-1)。 for (int i=0;i<sum;i++) { zhuan2=n[i];//因为zhuan2是int型变量,n[i]是char型变量,zhuan2会储存n[i]的ASCLL码值。 a[zhuan2]++;//对应的数组+1。 } for (int i=0;i<=122;i++)//判断ASCLL中不为零的数有哪些。 { if (a[i]!=0) { zhuan=i;//把数字转换为字符。 dz+=zhuan;//把字符加入字符串中,实现第一行为对应字符的效果(问题二解决)。 } } cout<<dz<<endl;//输出第一行 for (int i=0;i<=122;i++)//判断ASCLL中不为零的数有哪些。 { if (a[i]!=0) { cout<<a[i];//不为零就输出数字(ASCLL码对应字符出现次数)。 } }//程序结束
-
0
#include <bits/stdc++.h> using namespace std; int main() { string s; char x='a'; int a[26];//这是统计小写字母出现个数的数组 char b[26];//a~z; cin >>s; for (int i=0;i<26;i++)//初始化数组b; { b[i]=x; x+=1; } for (int i=0;i<26;i++)//初始化数组a; { a[i]=0; } for (int i=0;i<s.length()-1;i++) { a[s[i]-'a']++; } for (int i=0;i<26;i++) { if (a[i]!=0) { cout <<b[i]; } } cout <<endl; for (int i=0;i<26;i++) { if (a[i]!=0) { cout <<a[i]; } } return 0; }
-
0
直接使用计数排序的思想即可。 注意最后输出每个字符的个数的时候因为前面用的是char类型数组计数,a[i]需要在减去'0'之后加上'0'的ASCII码值48即可转换.
#include<bits/stdc++.h> using namespace std; char a[30]; int main() { char x; while(cin>>x &&x!='.') a[x]++; for(char i='a';i<='z';i++){ if (a[i]>0) cout<<i; } cout<<endl; for(char i='a';i<='z';i++){ if (a[i]>0) cout<<a[i]-'0'+48; } return 0; }
信息
- ID
- 177
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 5
- 标签
- 递交数
- 2662
- 已通过
- 1018
- 上传者