蓝桥杯省赛夺奖冲刺营散列表篇

蓝桥杯省赛夺奖冲刺营散列表篇

「弗里的的语言」

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

输入描述
第 1行,输入 N,代表共计创造了多少个单词。

第 2行至第 N+1行,输入 N 个单词。

输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO,多个重复单词输出最先出现的。

输入输出样例
示例1
输入

6
1fagas 
dsafa32j
lkiuopybncv
hfgdjytr
cncxfg
sdhrest

输出

NO

示例2
输入

5
sdfggfds
fgsdhsdf
dsfhsdhr
sdfhdfh
sdfggfds

输出

sdfggfds

运行限制
最大运行时间:3s
最大运行内存:512M

import java.util.Scanner;

public class Main {
	static final int h=999983;//余数
	static String[] Value=new String[h];//散列表
	static String[] UpValue=new String[h];//公共溢出区
	static int UpValueCount=0;//溢出区所含数
	public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();//单词个数
        boolean flag=false;//是否冲突
        String ans="NO";//答案
        while(n-->0) {
        	String word=sc.next();
        	if(flag) {
        		continue;
        	}
        	if(isAt(word)) {//已经有这个单词
        		flag=true;
        		ans=word;
        	}else {//添加单词
        		in(word);
        	}
        }
        System.out.println(ans);
	}
	private static boolean in(String word) {
		int n=Hx(word);
		if(Value[n]==null) {
			Value[n]=word;
			return true;
		}else if(Value[n].equals(word)){//已经有这个单词了
			return false;
		}else {
			for (int i = 0; i < UpValueCount; i++) {
				if(UpValue[i].equals(word)) {
					return false;
				}
			}
			UpValue[UpValueCount++]=word;
			return true;
		}
	}
	private static boolean isAt(String word) {
		int n=Hx(word);//所在位置
		if(Value[n]==null) {//没有单词
			return false;
		}else if(Value[n].equals(word)){//散列表有这个单词
			return true;
		}else {//公共区有
			for (int i = 0; i < UpValueCount; i++) {
				if(UpValue[i].equals(word)) {
					return true;
				}
			}
			return false;
		}
	}
	private static int Hx(String word) {
		return (word.hashCode()%h+h)%h;
	}
}

你可能感兴趣的:(13届蓝桥杯夺奖冲刺营,蓝桥杯,散列表,java)