到底买不买问题(C++)-编程练习题(100)

目录

问题:

分析:

C++代码:

总结:


问题:

6.

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

图1

【输入形式】

每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。

【输出形式】

如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。

【样例输入】

ppRYYGrrYBR2258
YrR8RrY

【样例输出】

Yes 8

分析:

方法1:一开始是想着将两个字符串获取之后拿代表小红想要珠子的字符串一个一个和代表商店珠串字符串对比,全部都有的话就输出表示可以买,然后相减就能得出多余个数。要是没有的话也可以使用一个变量来统计少了多少个。这种方法的时间复杂度O(n)=N*M,其中N为代表商店珠串字符串的长度,M为代表小红想要珠串字符串的长度。

方法2:后来想到了把代表摊主拥有珠串和小红想要珠串字符串分别统计一下,使用一个数组存储表示62种颜色(0-9,a-z,A-Z总共62个)的珠串每种颜色个数,然后再将两个数组对应位置对比,就可以得出多余或者缺少个数,如果没有缺少就代表可以购买,否则不能买。时间复杂度O(n)=N,其中N=代表商店珠串字符串的长度+代表小红想要珠串字符穿的长度+62。

C++代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string strShop;       //商店珠子颜色字符串
    string strCust;       //小红想要的颜色字符串
    int lenShop, lenCust; //字符串长度
    int shop[62];         //统计商店珠子,从0-9,a-z,A-Z,总共62个,统计每种颜色个数
    int cust[62];         //统计小红想要的珠子种类个数
    int more=0;           //多余个数
    int under=0;          //缺少个数

    getline(cin,strShop);       //获取代表商店珠子字符串
    getline(cin,strCust);       //获取代表小红想要珠子字符串
    lenCust = strCust.length(); //统计小红珠子长度
    lenShop = strShop.length(); //统计商店珠子长度
    for(int i=0; i<62; i++)     //初始化统计珠子种类个数数组
    {
        shop[i]=0;
        cust[i]=0;
    }
    for(int i=0; i<lenCust; i++) //统计小红想要的珠子每种颜色个数,然后存入数组cust[]
    {
        if(strCust[i] >= '0' && strCust[i] <= '9')
        {
            cust[strCust[i]-'0']++;
        }
        else if(strCust[i] >= 'a' && strCust[i] <= 'z')
        {
            cust[strCust[i]-'a' + 10]++;
        }
        else if(strCust[i] >= 'A' && strCust[i] <= 'Z')
        {
            cust[strCust[i]-'A' + 36]++;
        }
    }
    for(int i=0; i<lenShop; i++) //统计商店的珠子每种颜色个数,存入数组shop[]
    {
        cout << "strShop" << i << " :" <<strShop[i];
        if(strShop[i] >= '0' && strShop[i] <= '9')
        {
            shop[(strShop[i]-'0')]++;
        }
        else if(strShop[i] >= 'a' && strShop[i] <= 'z')
        {
            shop[(strShop[i]-'a' + 10)]++;
        }
        else if(strShop[i] >= 'A' && strShop[i] <= 'Z')
        {
            shop[(strShop[i]-'A' + 36)]++;
        }
    }
    for(int j=0; j<62; j++)   //统计判断是否是小红想要的珠串,是的话统计多余多少个,不是的话统计少了多少个
    {
        if(shop[j] < cust[j])
        {
            under += cust[j] - shop[j];
        }else{
            more += shop[j] -cust[j];
        }
    }
    if(0 == under)            //如果under等于0的话,说明不少,就输出Yes,并输出多余个数,否则输出NO,并输出少了几个
    {
        cout << "Yes " <<more <<endl;
    }else{
        cout << "No " << under <<endl;
    }
    return 0;
}

总结:

巧用数组可以节省很多时间,不光能少写很多if-else,还能让思路变得更加清晰。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值