数组下标的应用——①蒜头君的数字游戏I

Posted Polaris_GQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组下标的应用——①蒜头君的数字游戏I相关的知识,希望对你有一定的参考价值。

蒜头君有很多张写着数字的卡片,每张卡片上有一个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;

以上是关于数组下标的应用——①蒜头君的数字游戏I的主要内容,如果未能解决你的问题,请参考以下文章

蒜头君的新游戏

蒜头君的新游戏

计蒜客 蒜头君的数轴

蒜头君的树

蒜头君的城堡之旅(动态规划)

计蒜客习题 蒜头君的猜想(埃氏筛)