PAT 1078 C++

1.题意

这题是pat 1145的基础版。
给出一串数字,让其插入到哈希表中,然后给出这串数字在哈希表中的下标。如果有哈希冲突产生,则使用二次探测的方法解决冲突。

2.分析

这题还是很好写的,关键是对二次探测的理解。

3.代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>

using namespace std;

//获得一个 >=num 素数 
int getPrime(int num){
	int i; 
	if(num == 1)		return 2;  
	while(true){//
		for( i = 2;i <= sqrt(num);i++ ){
			if(num % i == 0){
				num++;
				break;//说明不是素数 
			}
		}
		if(i > sqrt(num)){
			break;
		}
	}
	return num;
}

int main(){
	int mSize,N;//其中Msize 是table size; N是需要插入的数字总数;M是待查找数字的总数 
	cin >> mSize >> N ;
	int i ,j;
	int tSize;
	tSize = getPrime(mSize);		
	int array[N];
	int hashTable[tSize];//得到一个tSize 大小的hash 表 
	
	memset(hashTable,0,sizeof(hashTable)); 
	//输入待插入的n个数 
	for(i = 0;i< N;i++){
		cin >> array[i];
	}
		
	//insert into table
	int index;//将元素放入hashTable 的下标 
	int res[N] ;
	int count = 0;
	for(i = 0;i< N;i++){		
		for(j = 0;j < tSize ;j++){
			index = (array[i] + (j * j)) % tSize ;
			if(hashTable[index] == 0){
				hashTable[index] = array[i];//赋值操作 				
				res[count++] = index;
				break;
			}
		}
		if(j == tSize){	
			res[count++] = -1;					
		}	
	}
	
	for(i = 0;i< count;i++){
		if(i != count-1){
			if(res[i] == -1){
				cout <<"- ";	
			}
			else{
				cout << res[i]<<" ";
			}			
		} 	
		else {
			if(res[i] == -1){
				cout <<"-";	
			}
			else{
				cout << res[i];
			}
		}
	} 
}

4.测试用例

4 4
10 6 4 15

4 4
10 6 4 11

1 2
1 3

5.执行结果

PAT 1078 C++ 版

6.坑点

  • 如何取>=Msize 的最小素数。【注意特殊测试用例 Msize = 1,否则第二个测试用例无法通过】
  • 输出格式的控制

相关文章:

  • 2021-12-08
  • 2021-04-19
  • 2021-11-10
  • 2021-12-15
  • 2021-09-02
  • 2021-05-29
  • 2022-01-18
  • 2021-08-03
猜你喜欢
  • 2021-09-16
  • 2021-05-27
  • 2021-07-02
  • 2021-09-19
  • 2022-01-12
  • 2021-04-07
  • 2021-06-07
相关资源
相似解决方案