刷题打卡 | PAT 乙级 1039 到底买不买

140 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

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

b7e2ffa6-8819-436d-ad79-a41263abe914.jpg

思路分析

这道题考察的是对字符串的操作
我使用了哈希数组来记录两个字符串中每个字符出现的次数,bead1[128],bead2[128]分别记录摊主和小红的珠子出现的次数,为什么不统计多余的珠子,是因为如果摊主的字符串包含了全部小红的全部字符串,字符串长度差就是多余的珠子
一些花絮:我使用了引用类型的增强for循环(char& c:s),这样比普通的增强for循环更快,因为普通的增强for循环是复制一个字符串进行遍历,而引用是直接操作,而且可以给要遍历的字符串的赋值,

AC代码

#include<bits/stdc++.h>
using namespace std;
int bead1[128],bead2[128],diff;//diff记录缺少的珠子
int main()
{
    bool buy=true;//未缺少字符(珠子)的标志,是否能买
    string s1,s2;
    cin>>s1>>s2;
    for(char& c1:s1)
        bead1[c1]++;
    for(char& c2:s2)
        bead2[c2]++;
    for(int i=0;i<128;i++)
        if(bead2[i])//小红的珠子存在
        {
            if(bead1[i]<bead2[i])//摊主的珠子比小红的少
            {
                buy=false;
                diff+=(bead2[i]-bead1[i]);
            }
        }
    if(buy) cout<<"Yes "<<s1.length()-s2.length();//珠子都齐直接输出长度差
    else cout<<"No "<<diff;
}

总结

真是三十年河东,三十年河西。
遥想去年看这题还是手足无措,今日视之,亦不过尔尔
学会哈希散列真的好爽哈哈哈