pat 数据结构与算法题目集
给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例:
4 5
24 15 61 88
输出样例:
4 0 1 3
题目看起来很简单,却有两个坑点,
1.线性探测小心一直加会超出数组的长度
2.如果要填入的数字已经出现过了,则直接输出第一次的散列位置
ac代码
/*
Name:
Copyright:
Author: 流照君
Date: data
Description:
*/
#include <iostream>
#include<string>
#include <algorithm>
#include <vector>
#define inf 100005
using namespace std;
typedef long long ll;
int arr[inf];
int main(int argc, char** argv)
{
#ifdef ONLINE_JUDGE//条件编译,如果有oj则忽略文件读取
#else
//freopen("in.txt", "r", stdin);//输入输出文件重定向
//freopen("out.txt", "w", stdout);
#endif //#if, #ifdef, #ifndef这些条件命令的结束标志.
//代码位置
int n,p,temp,flag=0;
cin>>n>>p;
fill(arr,arr+inf,0);
while(n--)
{
int flag1=0;
cin>>temp;
int pos=temp%p;
for(int i=0;i<p;i++)
{
if(arr[i]==temp)
{
flag1=1;
cout<<" "<<i;
break;
}
}
if(flag1)
continue;
while(arr[pos]!=0)
{
pos=(pos+1)%p;
}
if(!flag)
cout<<pos;
else
cout<<" "<<pos;
arr[pos]=temp;
flag=1;
}
return 0;
}