PAT-B 1039. 到底买不买(20)

题目链接在此。

思路及代码

非hash:
1. 需要一个bool型数组gflag,数组中的某一项如果为true则表示这一项的下标球已经被买; 需要一个count变量,存放还需要买几个球。
2. 在遍历第二个字符串的时候遍历第一个字符串,如果是要买的球,则标记上gflag数组相应的位置并且count–,如果没找到,则开始查询第二个串的下一个。
3. 最后,如果conut>0则表示还要珠子是需要买没买到的;count==0则表示买齐了,按照题目要求输出即可。

AC代码:

#include
#include
#include

using namespace std;

int main(){

    char goods[1010], buy[1010];
    bool gflag[1010] = {false}; //标识是非被选定 

    gets(goods);
    gets(buy);

    int glen = strlen(goods);
    int blen = strlen(buy);
    int count = blen; //用来保存还需要买几颗珠子 

    for(int i = 0 ; i < blen; i++){
        char b = buy[i];
        int j;
        for(j = 0; j < glen; j++){
            char g = goods[j];
            if(g == b && gflag[j]==false) {  //是要买的珠子 
                count--;
                gflag[j] = true; //标记为已被选定 
                break;
            }
        } 
    }

    if(count == 0){ //都选到了,则可以买 
        printf("Yes %d\n",glen-blen); 
    }else{ //不能卖
        printf("No %d\n",count); 
    }

    return 0;
}

hash思路:

因为输入只会是大小写字母以及数字,所以讲这些字符一一对应到整数,用hashTable数组保存每个字符的个数,用miss变量保存缺少的字符个数;

遍历第二个字符串的时候,将相应的字符个数-1,如果个数小于零,则表明缺少了,则miss++。

AC代码:

#include
#include
#include

using namespace std;

int change(char x){
    if(x >= '0' && x <= '9') return x-'0';
    else if(x >= 'A' && x <= 'Z') return x-'A'+10;
    else return x-'a'+36;
}

int hashTable[1010] = {0};

int main(){

    char str[1010];
    int miss = 0;

    //读入第一串 
    gets(str);

    //记录每种颜色球的个数 
    int len1 = strlen(str);
    for(int i = 0; i < len1; i++){
        int index = change(str[i]);
        hashTable[index]++;
    }

    //读入第二串 
    gets(str);
    int len2 = strlen(str);
    for(int i = 0 ; i < len2; i++){
        int index = change(str[i]);
        hashTable[index]--;
        if(hashTable[index] < 0){ //缺少了这种颜色的球 
            miss++;
        }
    }

    if(miss > 0){ //有缺少的球 
        printf("No %d\n",miss); 
    }else{ //都买到了 
        printf("Yes %d\n",len1-len2);
    }

    return 0;
}

你可能感兴趣的:(PAT,(Basic,Level),Practice)