本专栏持续输出数据结构题目集,欢迎订阅。
题目

据香港《南华早报》2019年7月15日文章,上海严格的垃圾分类新规令不少居民抓狂。这催生出大量帮助找出正确分类答案的App和小程序。目前仅微信上就至少有280种与垃圾处理有关的App,在苹果应用商店也达130种。支付宝表示,已有60多家独立App开发商申请为该平台提供类似服务。
本题就请你现场实现一个简单的垃圾分类小助手。
输入格式:
输入首先给出官方分类指南中每种物品的归属。在一行中给出一个正整数 N(≤10^5),即物品数量;随后 N 行,每行给出一个物品名称(长度不超过 10 的、由小写英文字母和下划线组成的字符串)和该物品所属的分类(1 代表干垃圾、2 代表湿垃圾、3 代表可回收物、4 代表有害垃圾)。题目保证所有物品名称无重复。
随后每行给出一个查询物品的名称(格式与指南物品名称相同)。最后一行给出结束符 #,表示查询终止,这一行不需要查询。
输出格式:
对每个查询的物品,在一行中给出其所属分类:Gan laji 代表干垃圾;Shi laji 代表湿垃圾;Ke Hui Shou 代表可回收物;You Hai laji 代表有害垃圾。如果查询的物品不在指南中,则输出 ? 表示不知道。
输入样例:
4
bao_zhi 3
dian_chi 4
dan_ke 2
bei_ke 1
dan_ke
dian_chi
ren_zha
bao_zhi
bei_ke
#
输出样例:
Shi laji
You Hai laji
?
Ke Hui Shou
Gan laji
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义哈希表大小,选择一个较大的素数以减少冲突
#define HASH_SIZE 100003
// 哈希表节点结构
typedef struct Node {
char name[11]; // 物品名称,最长10个字符
int category; // 分类
struct Node* next; // 用于处理哈希冲突的链表
} Node;
// 计算字符串的哈希值
unsigned int hash(const char* str) {
unsigned int h = 0;
while (*str) {
h = (h * 31 + *str++) % HASH_SIZE;
}
return h;
}
int main() {
int N;
scanf("%d", &N);
// 初始化哈希表
Node* hashTable[HASH_SIZE] = {NULL};
// 读取物品分类信息并存储到哈希表
for (int i = 0; i < N; i++) {
char name[11];
int category;
scanf("%s %d", name, &category);
// 计算哈希值
unsigned int h = hash(name);
// 创建新节点
Node* newNode = (Node*)malloc(sizeof(Node));
strcpy(newNode->name, name);
newNode->category = category;
newNode->next = NULL;
// 插入哈希表(头插法)
if (hashTable[h] == NULL) {
hashTable[h] = newNode;
} else {
newNode->next = hashTable[h];
hashTable[h] = newNode;
}
}
// 处理查询
char query[11];
while (1) {
scanf("%s", query);
// 检查是否为结束符
if (strcmp(query, "#") == 0) {
break;
}
// 计算查询物品的哈希值
unsigned int h = hash(query);
// 在哈希表中查找
Node* current = hashTable[h];
int found = 0;
while (current != NULL) {
if (strcmp(current->name, query) == 0) {
// 找到物品,输出分类
switch (current->category) {
case 1:
printf("Gan laji\n");
break;
case 2:
printf("Shi laji\n");
break;
case 3:
printf("Ke Hui Shou\n");
break;
case 4:
printf("You Hai laji\n");
break;
}
found = 1;
break;
}
current = current->next;
}
// 未找到物品
if (!found) {
printf("?\n");
}
}
return 0;
}
585

被折叠的 条评论
为什么被折叠?



