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

蓝桥杯省赛夺奖冲刺营散列表篇 「弗里的的语言」
题目描述
小发明家弗里想创造一种新的语言,众所周知,发明一门语言是非常困难的,首先你就要克服一个困难就是,有大量的单词需要处理,现在弗里求助你帮他写一款程序,判断是否出现重复的两个单词。
输入描述
第 1行,输入 N,代表共计创造了多少个单词。
第 2行至第 N+1行,输入 N 个单词。
输出描述
输出仅一行。若有重复的单词,就输出重复单词,没有重复单词,就输出 NO,多个重复单词输出最先出现的。
输入输出样例
示例1
输入

6 1fagas dsafa32j lkiuopybncv hfgdjytr cncxfg sdhrest

输出
NO

示例2
输入
5 sdfggfds fgsdhsdf dsfhsdhr sdfhdfh sdfggfds

输出
sdfggfds

【13届蓝桥杯夺奖冲刺营|蓝桥杯省赛夺奖冲刺营散列表篇】运行限制
最大运行时间:3s
最大运行内存:512M
import java.util.Scanner; public class Main { static final int h=999983; //余数 static String[] Value=https://www.it610.com/article/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; } }

    推荐阅读