引入问题:
「弗里的的语言」
题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,判断是否出现重复的两个单词。
输入描述
第 1 行,输入 N,代表共计创造了多少个单词。
第 2 行至第 N+1 行,输入 N 个单词。
1≤N≤10^4,保证字符串的总输入量不超过 10^6。
输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出
NO
,多个重复单词输出最先出现的。输入输出样例
示例1
输入
6 1fagas dsafa32j lkiuopybncv hfgdjytr cncxfg sdhrest
输出
示例2
输入
5 sdfggfds fgsdhsdf dsfhsdhr sdfhdfh sdfggfds
输出
sdfggfds
import java.util.Scanner;
public class 散列表 {
static final int h = 999983;
static String[] Value = new String[h];//基本表
static String[] UpValue = new String[h];//溢出表
static int UpValueCount = 0;
//散列表映射函数
static int Hx(String s) {
return (s.hashCode()%h + h) % h;
}
//查询函数(查询是否存在)
static boolean isAt(String s) {
int n = Hx(s);
if(Value[n] == null) return false;
else if(Value[n].equals(s)) return true;
else {
for(int i = 0; i < UpValueCount; i++) {
if(UpValue[i].equals(s)) return true;
}
return false;
}
}
//插入散列表函数
static boolean in(String s) {
int n = Hx(s);
if(Value[n] == null) {
Value[n] = s;
return true;
}else {
for(int i = 0; i < UpValueCount; i++) {
if(UpValue[i].equals(s)) return false;
}//判断溢出表有没有重复单词,有重复就不插入了
UpValue[UpValueCount++] = s;
return true;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
boolean flag = false;
Scanner in = new Scanner(System.in);
String ans = "NO";
n = in.nextInt();
for(int i = 0; i < n; i++) {
String word;
word = in.next();
System.out.println(Hx(word));
if(flag) continue;//如果flag为true,说明找到相同的单词,一直跳过下面判断
if(isAt(word)) {
flag = true;
ans = word;
}else {
in(word);
}
}
System.out.println(ans);
}
}