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

该博客介绍了一个使用散列表解决单词重复问题的算法,通过Java实现。程序接收输入的单词数量和单词本身,判断是否有重复单词并输出结果。当存在重复单词时,输出第一个重复的单词;否则输出'NO'。程序在3秒内运行,最大内存限制为512M。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

「弗里的的语言」

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

输入描述
第 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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值