题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,
判断是否出现重复的两个单词。
输入描述
第 1 行,输入 N,代表共计创造了多少个单词。
第 2 行至第 N+1 行,输入 N 个单词。
1≤N≤10^4,保证字符串的总输入量不超过 10^6。
输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO,多个重复单词输出最先出现的。
输入
6
1fagas
dsafa32j
lkiuopybncv
hfgdjytr
cncxfg
sdhrest
输出
NO
输入
5
sdfggfds
fgsdhsdf
dsfhsdhr
sdfhdfh
sdfggfds
输出
sdfggfds
源码实现
public class 弗里的的语言 {
static final int s = 999983;
static String[] value = new String[s];//散列表
static String[] upValue = new String[s];//公共溢出区
static int upCount = 0;//溢出区栈顶
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
boolean repeat = false;
String ans = "NO";
for (int i = 0; i < num; i++) {
String w = scan.next();
if (repeat) break;
if (isHave(w)){
repeat = true;
ans = w;
}else {
in(w);
}
}
System.out.println(ans);
scan.close();
}
public static void in(String word){
int h = hx(word);
if (value[h]==null){//散列表对应位置没有值,因为已经判断过有没有这个字符串了,所以只需要考虑加在散列表里,还是公共溢出区
value[h] = word;
}else{
upValue[upCount++] = word;
}
}
public static int hx(String word){
return (word.hashCode()%s+s)%s;//哈希值会因为int溢出产生负数,去掉负数的情况以免数组下标越界
}
public static boolean isHave(String word){
int h = hx(word);
if (value[h]==null){//散列表对应位置没有值
return false;
}else if (value[h].equals(word)){//有值,且就是这个单词
return true;
}else{//有值,但不是这个单词
for (int i=0;i<upCount;i++){//去公共溢出区找
if (upValue[i].equals(word)) return true;
}
return false;
}
}
}