4.2 散列
4.2 散列
http://codeup.hustoj.com/contest.php?cid=100000582
B 分组统计

题目解析
-
要定义两个数组 num、g 分别存储输入的两行数据(数字及其对应的分组序号)。
-
定义两个数组 ansn、ansg 来记录不重复的数字和分组序号。(通过exist数组来记录是否已存在)
-
定义数组 group[i][j] 记录数字i在j组中出现次数。
-
最后二重循环遍历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)

题目释义
给定字符串s1,s2(各字符数不超过10e4),除去s1中所有s2字符后输出。
⚠️s1、s2中可能包含空格。
题目解析
s1、s2中可能包含空格,所以要用gets读入。
解题思路1:
-
使用gets读入s1、s2后,赋值给string
-
遍历s1使用find函数查找s2中字符,并使用erase函数删除。
解题思路2【使用hash】:
- 使用gets读入s1、s2
- 定义hidden数组并初始化为false,hidden[i]=true表示要隐藏s1中的i字符(hidden只需200空间,因为所有字符ASCII在[0,127]之间)
- 遍历s2中字符i,hidden[i]=true
- 遍历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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步