0
点赞
收藏
分享

微信扫一扫

【蓝桥杯省赛学习题Java】弗里的的语言(hash)

飞空之羽 2022-03-14 阅读 84

题目描述

小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,
判断是否出现重复的两个单词。

输入描述

第 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;
        }
    }
}
举报

相关推荐

0 条评论