7-73 整型关键字的散列映射 (25分)

给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。

输入格式:

输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

输出格式:

在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:

4 5
24 15 61 88

输出样例:

4 0 1 3

这个题目挺坑的,需要注意一个点,输入重复数字的时候不被人为是两个数字,他们占据同样的位置,知道这一点之后这道题目就很简单了,我是使用的set集合处理的 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+200;
int sign[N];
int arr[N],cnt;
int main(){
	int n,p,num;
	cin>>n>>p;
	unordered_map<int,bool> ma;
	set<int> s;
	for(int i=0;i<n;i++){
		cin>>num;
		int t=num;
		if(s.find(num)!=s.end()){
			printf(" %d",sign[num]);
			continue;
		}
		s.insert(num);
		num=num%p;
		if(ma[num]==false){
			ma[num]=true;
			if(cnt==0){
				printf("%d",num);
				cnt=1;
			}else{
				printf(" %d",num);
			}
			sign[t]=num;
		}
		else{
			while(1){
				if(ma[(num+1)%p]==false){
					ma[(num+1)%p]=true;
					printf(" %d",(num+1)%p);
					sign[t]=(num+1)%p;
					break;
				}else{
					num++;
				}
			}
		}
	}
	return 0;
}
发布了43 篇原创文章 · 获赞 7 · 访问量 1245

猜你喜欢

转载自blog.csdn.net/Young_Naive/article/details/104410789