知识点:哈希表的构建+开放寻址法+拉链法
维护一个集合,支持如下几种操作:
- “I x”,插入一个数x;
- “Q x”,询问数x是否在集合中出现过;
现在要进行N次操作,对于每个询问操作输出对应的结果。
输入格式
第一行包含整数N,表示操作数量。
接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。
输出格式
对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。
每个结果占一行。
数据范围
1≤N≤1051≤N≤105
−109≤x≤109−109≤x≤109
输入样例:
5
I 1
I 2
I 3
Q 2
Q 5
输出样例:
Yes
No
//开放寻址法
import java.io.*;
import java.util.*;
import java.lang.*;
class Main{
static int N = 200003;//一般是最大区间的两倍,且是素数
static int[] h = new int[N];
static int NULL = 0x3f3f3f;//大于10^9的数
static int find(int x){
int k = (x % N + N) % N;//如果出现负数则将负数转为正数
while(h[k] != NULL && h[k] != x){
k++;
if(k == N)k = 0;
}
return k;
}
public static void main(String[] args)throws Exception{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter buw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.valueOf(buf.readLine());
Arrays.fill(h, NULL);
while(n-- != 0){
String[] params = buf.readLine().split(" ");
int x = Integer.valueOf(params[1]);
int k = find(x);
if("I".equals(params[0])){
h[k] = x;
}else{
if(h[k] != NULL){
buw.write("Yes\n");
}else{
buw.write("No\n");
}
}
}
buw.flush();
buf.close();
buw.close();
}
}
//拉链法
import java.io.*;
import java.util.*;
import java.lang.*;
class Main{
static int N = 100003;//一般是最大区间的两倍,且是素数
static int[] h = new int[N];//哈希数组
static int[] e = new int[N];//节点值数组
static int[] ne = new int[N];//节点next下标数组
static int idx = 0;//节点当前下标
static void insert(int x){//头插法在哈希数组头部插入节点
int k = (x % N + N) % N;
e[idx] = x;
ne[idx] = h[k];
h[k] = idx++;
}
static boolean query(int x){//遍历链表查找值
int k = (x % N + N) % N;//如果出现负数则将负数转为正数
for(int i = h[k]; i != -1; i = ne[i]){
if(e[i] == x)return true;
}
return false;
}
public static void main(String[] args)throws Exception{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter buw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.valueOf(buf.readLine());
Arrays.fill(h, -1);
while(n-- != 0){
String[] params = buf.readLine().split(" ");
int x = Integer.valueOf(params[1]);
if("I".equals(params[0])){
insert(x);
}else{
if(query(x)){
buw.write("Yes\n");
}else{
buw.write("No\n");
}
}
}
buw.flush();
buf.close();
buw.close();
}
}