题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,
 判断是否出现重复的两个单词。
输入描述
第 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;
        }
    }
}










