曾经沧海难为水,除却巫山不是云。|

Joey-Wang

园龄:4年3个月粉丝:17关注:0

4.2 散列

4.2 散列

http://codeup.hustoj.com/contest.php?cid=100000582

B 分组统计

image-20200705230755395

题目解析

  1. 要定义两个数组 num、g 分别存储输入的两行数据(数字及其对应的分组序号)。

  2. 定义两个数组 ansn、ansg 来记录不重复的数字和分组序号。(通过exist数组来记录是否已存在)

  3. 定义数组 group[i][j] 记录数字i在j组中出现次数。

  4. 最后二重循环遍历ansn、ansg,按要求输出对应group[ ansn[i] ][ ansg[j] ]

代码

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int num[105];  //记录输入的所有数
int g[105];  //记录所有组的序号
int ansn[105], ansg[105];  //ansn记录不重复的数,ansg记录不重复的组
bool exist[10005]; //existn[i]记录数i是否已经存在与num数组中,记录组i是否已经存在与g数组中
int main() {
    int m, n;
    while (scanf("%d", &m) != EOF) {
        while (m--) {
            memset(exist,0,sizeof(exist));
            int group[105][10005] = {0};  //group[i][j]表示第i组中j数出现次数
            int numlen = 0, glen = 0;

            scanf("%d", &n);
            for (int i = 0; i < n; i++) {
                scanf("%d", &num[i]);
                if (!exist[num[i]]) {
                    ansn[numlen++] = num[i];
                    exist[num[i]] = true;
                }
            }

            memset(exist,0,sizeof(exist));
            for (int i = 0; i < n; i++) {
                scanf("%d", &g[i]);
                if (!exist[g[i]]) {
                    ansg[glen++] = g[i];
                    exist[g[i]] = true;
                }
                group[g[i]][num[i]]++;
            }
          
            sort(ansn, ansn + numlen);
            sort(ansg, ansg + glen);
            for (int i = 0; i < glen; i++) {
                printf("%d={", ansg[i]);
                for (int j = 0; j < numlen; j++) {
                    printf("%d=%d", ansn[j], group[ansg[i]][ansn[j]]);
                    if (j != numlen - 1) printf(",");
                    else printf("}\n");
                }
            }
        }
    }
    return 0;
}

D String Subtraction (20)

image-20200705231731379

题目释义

给定字符串s1,s2(各字符数不超过10e4),除去s1中所有s2字符后输出。

⚠️s1、s2中可能包含空格。

题目解析

s1、s2中可能包含空格,所以要用gets读入。

解题思路1:

  1. 使用gets读入s1、s2后,赋值给string

  2. 遍历s1使用find函数查找s2中字符,并使用erase函数删除。

解题思路2【使用hash】:

  1. 使用gets读入s1、s2
  2. 定义hidden数组并初始化为false,hidden[i]=true表示要隐藏s1中的i字符(hidden只需200空间,因为所有字符ASCII在[0,127]之间)
  3. 遍历s2中字符i,hidden[i]=true
  4. 遍历s1中字符i,若hidden[i]=false,则输出此字符

代码1

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
char temp[10005];
int main(){
    string s1,s2;
    int pos;
    while(gets(temp)!=NULL){
        s1=temp;
        gets(temp);
        s2=temp;
        for(int i=0;i<s2.length();i++){
            pos=s1.find(s2[i]);
            while(pos!=string::npos){
                s1.erase(pos,1);
                pos=s1.find(s2[i]);
            }
        }
        cout<<s1<<endl;
    }
    return 0;
}

代码2

#include <cstdio>
#include <cstring>

char s1[10005], s2[10005];

int main() {
    while (gets(s1) != NULL) {
        bool hidden[200] = {false};
        gets(s2);
        int lens1 = strlen(s1), lens2 = strlen(s2);
        for (int i = 0; i < lens2; i++) {
            hidden[s2[i]] = true;
        }
        for (int i = 0; i < lens1; i++) {
            if (!hidden[s1[i]]) printf("%c", s1[i]);
        }
        printf("\n");
    }
    return 0;
}

本文作者:Joey-Wang

本文链接:https://www.cnblogs.com/joey-wang/p/14541165.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Joey-Wang  阅读(66)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开