我是靠谱客的博主 单薄灯泡,最近开发中收集的这篇文章主要介绍7-15 航空公司VIP客户查询(哈希表的链表实现),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。

输入格式:

输入首先给出两个正整数N(≤105)和K(≤500)。其中K是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于K公里的航班也按K公里累积。随后N行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组成,校验码的取值范围为0~9和x共11个符号;飞行里程单位为公里,是(0, 15 000]区间内的整数。然后给出一个正整数M(≤105),随后给出M行查询人的身份证号码。

输出格式:

对每个查询人,给出其当前的里程累积值。如果该人不是会员,则输出No Info。每个查询结果占一行。

输入样例:

4 500
330106199010080419 499
110108198403100012 15000
120104195510156021 800
330106199010080419 1
4
120104195510156021
110108198403100012
330106199010080419
33010619901008041x

输出样例:

800
15000
1000
No Info

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

这个题首先告诉你,只要你懂了歪门邪道的念头大概率都会超时的哟,什么c++的map什么的,别问,问就是我试过,还是要老老实实的用哈希表来做吧,像这种大数据来说,最好不过了,还是老样子,提供c语言版(其实c++里面也有hash函数的,个人在网上查了一些但是搞不太懂,)

1.c语言版

#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <cstdio>
#define maxm 100005
using namespace std;
//看到网上的题解发现string在map中应用时间特别长,所以考虑将字符串转化为long long来看
/*
int main()
{
map<string ,int> m;
int n,l;
cin>>n>>l;
for(int i=0;i<n;i++)
{
string s;
int x;
cin>>s>>x;
x=max(l,x);//最小值为l
m[s]+=x;//注意可能有相同的
}
int k;
cin>>k;
while(k--)
{
string ss;
cin>>ss;
map<string,int>::iterator it=m.find(ss);//查找
if(it!=m.end())//找到le
{
if(m[ss]<l)
cout<<l<<endl;
else
cout<<m[ss]<<endl;
}
else
cout<<"No Info"<<endl;
}
return 0;
}
*/
//哈希函数映射,取余10003
//单独构造一个哈希求键值的函数
//还需要单独创建一个单链表来表示身份证号用来找出相同的项进行合并
struct node{
char s[20];
int v;
struct node *next;
node(){v=0;next=NULL;}
};//哈希节点的构造
node h[maxm];
int Hash(char s[])//哈希转换函数
{
int idx = 0,i;
for( i = 0; i < 17; i++)
{
idx = (idx*10 + s[i]-'0')%10003;
}
if(s[i]=='x') idx = (idx*10 + 11)%10003;
else idx = (idx*10 + s[i]-'0')%10003;
return idx;
}
void add(int idx,char s[],int v)//向哈希表中添加节点并合并相同项
{
int flag=0;//标记
node *fp=&h[idx];
node *sp=h[idx].next;
while(sp)
{
if(!strcmp(sp->s,s))
{
sp->v+=v;
flag=1;
break;
}
fp=sp;
sp=sp->next;
}
if(!flag)
{
fp->next=new node();
strcpy(fp->next->s,s);//注意不能用c++的直接赋值会出错fp->next->s=s;
fp->next->v=v;
}
}
void find(char s[])//哈希查找
{
int idx=Hash(s);
node *fp=&h[idx];
node *sp=h[idx].next;
int flag1=0;
while (sp)
{
if (strcmp(sp->s,s) == 0)
{
printf("%dn", sp->v);
flag1=1;
break;
}
fp = sp;
sp = sp->next;
}
if (!flag1)
printf("No Infon");
}
int main()
{
int n,l;
cin>>n>>l;
char s[20];
for(int i=0;i<n;i++)
{
int x;
scanf("%s %d",s,&x);
if(x<l)
x=l;
int m=Hash(s);
add(m,s,x);
}
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%s",s);
find(s);
}
return 0;
}

其中具体的代码意思我再代码段中做了些注释,应该比较好理解,就不多做解释了,重点就在与不用map的话要将带字符串的记录保存下来,可以将字符串变为数字并且缩小来实现,还有就是注意哈希表的下标表示的就是字符串由哈希函数转换而来的值,而链表的创建可以保证在下标不连续的情况下得以连续遍历来确定有无相同项需要合并。

最后

以上就是单薄灯泡为你收集整理的7-15 航空公司VIP客户查询(哈希表的链表实现)的全部内容,希望文章能够帮你解决7-15 航空公司VIP客户查询(哈希表的链表实现)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部