蒜头君有很多张写着数字的卡片,每张卡片上有一个1-10之间的整数,现在需要我们统计每张卡片多少张。
思路:
1)定义一个长度为11的数组存储卡片的信息;
数组的下标——>表示卡片上的数字;
数组元素——>表示卡片出现的次数;
int cnt[11];//定义全局变量的好处:将数组元素全部初始化为0
2)每读入一个数,就将对应的数组元素的值加一;
cin>>temp;
cnt[temp]++;
此时,cnt[1]中存储的是数字1出现的次数,cnt[2]中存储的数字2出现的次数;
完整的代码
#include <iostream>
using namespace std;
int cnt[11];
int main() {
int n;
cin >> n;//一共n张卡片
for (int i = 0; i < n; i++) {
int temp; //卡片上的数字temp
cin >> temp;
cnt[temp]++;//temp卡片的个数
}
for(int i=1;i<=10;i++){
cout<<i<<" "<<cnt[i]<<endl;//循环遍历输出
}
return 0;
}
运行
扩展 1
在原题基础上,统计出现次数最多的卡片的次数,以及卡片数。
思路
1)定义一个变量max存储最大出现次数,并将其初始化为-1;
定义一个变量index存储卡片的值;
int max=-1,index;
2)一个数的出现次数大于等于max,我们就更新max和index的值,这样就保证max中始终存储最大出现次数,index中始终存储出现次数的数中的最大值;
if(max<=cnt[i]){
max=cnt[i];//更新max的值
index=i;//i=temp=index
}
完整代码
#include <iostream>
using namespace std;
int cnt[11];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int temp;
cin >> temp;
cnt[temp]++;
}
int max=-1,index;//max存储最大出现次数,index存储众数
for(int i=1;i<=10;i++){
if(max<=cnt[i]){
max=cnt[i];
index=i;
}
}
cout<<max<<" "<<index;
return 0;
}
扩展 2
蒜头君还拥有很多张写着大写字母的卡片,每张卡片上有一个A~Z之间的字母,俗话说物以稀为贵,现在我们想找出出现次数最少的字母,如果这样的字母有多个,我们只需要ASCII码最小的一个。
思路
1)相邻的大写字母的ASCII码相差1,一共26个英文字母;
定义一个长度为26的数组存储每个字母的出现次数;
int cnt[26];
cnt[0]中存储字母A出现的次数,cnt[1]存储字母B出现的次数,依次类推;
2)统计个数;
cnt[s[i]-'A']++;
3)定义变量min记录出现次数最少的字母,将其值初始化为s.size()+1,保证后续min的值可以正常更新,当然,你也可以设置一个非常大的整数;
int min=s.size()+1,index;
4)如果一个数的出现次数小于min且不为0,那么就更新min和index的值,保证min中始终存储最小出现次数,index中始终存储出现最少次数的字母中ASCII码最小的一个;
for(int i=0;i<26;i++){
if(min>cnt[i]&&cnt[i]!=0){
min=cnt[i];
//index=s[i];
index=i;
}
}
5)index中的值表示出现次数最少的字母中最小的与字符A的ASCII码的差值,因此需要强制类型转换,才能输出对应的字母;
cout<<min<<" "<<(char)(index+'A');
完整代码
#include <iostream>
#include <string>
using namespace std;
int cnt[26];
int main() {
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
cnt[s[i]-'A']++;
}
int min=s.size()+1,index;
for(int i=0;i<26;i++){
if(min>cnt[i]&&cnt[i]!=0){
min=cnt[i];
//index=s[i];
index=i;
}
}
cout<<min<<" "<<(char)(index+'A');
return 0;
}