题解 | #记票统计#
记票统计
http://www.nowcoder.com/practice/3350d379a5d44054b219de7af6708894
快速排序+二分查找
快速排序的时候排序指向字符串的指针
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct candidate{
char name[20];
int cnt;
}Candi;
int cmp(const void *p1,const void *p2);
int binsearch(const char *vote,Candi *pt_index[],int max);
int main(void)
{
int n,cnt,i,invalid;
char tmp[20];
while(scanf("%d",&n) == 1){
Candi index[n];
Candi *pt_index[n];
for(i=0;i<n;i++){
scanf("%s",&index[i].name);
index[i].cnt = 0;
pt_index[i] = &index[i];
}
qsort(pt_index,n,sizeof(Candi *),cmp);
scanf("%d",&cnt);
invalid = cnt;
for(i=0;i<cnt;i++){
scanf("%s",tmp);
invalid -= binsearch(tmp,pt_index,n-1);
}
for(i=0;i<n;i++){
printf("%s : %d\n",&index[i].name,index[i].cnt);
}
printf("Invalid : %d\n",invalid);
}
return 0;
}
int cmp(const void *p1,const void *p2)
{
return strcmp((*(Candi **)p1)->name,(*(Candi **)p2)->name);
}
int binsearch(const char *vote,Candi *pt_index[],int max)
{
int min = 0,mid = max/2,flag = 0,i = 0;
for(;min <= max;mid = (min + max)/2){
if(strcmp(vote,pt_index[mid]->name) == 0){
flag = 1;
pt_index[mid]->cnt ++;
break;
}else if(strcmp(vote,pt_index[mid]->name) < 0){
max = mid - 1;
}else{
min = mid + 1;
}
}
return flag;
}
查看3道真题和解析
