题解 | #记票统计#
记票统计
https://www.nowcoder.com/practice/3350d379a5d44054b219de7af6708894
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//{name,couny}结构体数组,结构体在数组中的索引=f(name)
//大数据时,地址范围<<key范围,不可能为每一个数据,预留存储地址,需要处理冲突,溢出?
//小数据时,key和地址可以一一对应
//某张投票是否是有效的票,需要和候选人行一系列比较,散列是为了避免比较
typedef struct node {
int cnt;
char name[20];
int flag;//0未使用,1使用,2删除,暂不考虑删除
} NODE;
//插入index=node.name[0]*4%99,冲突时,顺序往后找,一定能找到位置存放候选人
//搜索时,从算出的index一直往后,找到node.name=NULL,或者node.name=下一个计算的地址值
NODE hashTable[120];
int main() {
int n1 = 0, n2 = 0, i = 0, j = 0, index = 0, invalid=0;
char tempName[20];
int indexNum = 0;
int* indexBak = NULL;
if (scanf("%d", &n1) != EOF) {
indexBak = (int*)malloc(n1 * sizeof(int));
for (i = 0; i < n1; i++) {
scanf("%s", tempName);
index = (tempName[0]-'A') * 4%120; //所有候选人均匀分布在100个地址上
while (hashTable[index].flag)
index++;
hashTable[index].flag = 1;
strcpy(hashTable[index].name, tempName);
indexBak[indexNum++] = index;
}
scanf("%d", &n2);
for (i = 0; i < n2; i++) {
scanf("%s", tempName);
index = (tempName[0]-'A') * 4%120;
while (hashTable[index].flag) {
if (strcmp(hashTable[index].name, tempName)==0) {
hashTable[index].cnt++;
break;
}
index++;
}
if(!hashTable[index].flag)
invalid++;
}
for (i = 0; i < n1; i++) {
printf("%s : %d\n", hashTable[indexBak[i]].name, hashTable[indexBak[i]].cnt);
}
free(indexBak);
printf("Invalid : %d",invalid);
}
return 0;
}
腾讯公司福利 1157人发布