[NOIP2008]笨小猴_牛客题霸_牛客网
【描述】
eg1中,输入“error”
“e”出现了1次,“r”出现了3次,“o”出现了1次
最大是3,最小是1,3-1=2,2是质数,所以输出“Lucky word”和这个单词
eg2中,输入“Olympic”
所有单词都出现了1次,最大和最小都是1,1-1=0,0不是质数,输出“No Answer”和这个单词
【分析】
解法:模拟+哈希表(统计每个字符出现的个数)+试除法判断质数
思路:统计单词中每个字符出现的次数时,使用数组模拟的哈希表(大小为int[26]),然后在哈希表中找出次数的最大值和最小值
注意:考虑最小值不要考虑0,因为0代表没有出现过
找到这两个数后,将两个数相减,用得到的判断是否为质数(使用试除法)
试除法:从2开始一直循环到根号n,一个一个来除,若n%这个数==0,说明不是质数,如果所有数都模完结果都!=0,说明这是质数
【代码】
import java.util.Scanner;
public class Main
{
public static boolean ispirm(int n)
{
if(n < 2) return false;
for(int i = 2;i <= Math.sqrt(n);i++)
{
if(n % i == 0) return false;
}
return true;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
char[] s = in.next().toCharArray();
int[] hash = new int[26];
for(int i = 0;i < s.length;i++)
{
hash[s[i] - 'a']++; //减去字符a是为了判断下标的映射关系
}
int maxn = 0,minn = 1000;
for(int i = 0;i < 26;i++)
{
if(hash[i] != 0)
{
minn = Math.min(minn, hash[i]);
maxn = Math.max(maxn, hash[i]);
}
}
if(ispirm(maxn - minn))
{
System.out.println("Lucky Word");
System.out.println(maxn - minn);
}else
{
System.out.println("No Answer");
System.out.println(0);
}
}
}