漫长的洛谷之旅
思路:
我觉得这一题的问题在于存放出现最多的字母的次数,和出现次数最少的字母的次数,解决了这个问题,其他的也就很好解决了,首先通过一个容器将每个字符出现的次数记录下来,那当然是要用数组了,顺便利用char类型的本质是ASCII码的特性,数组的索引就代表不同的字母,只不过是数字表示的,接下来一顿操作就出来了。
注意
在运行过程中也发现了一些问题
1.数组的默认值是0,那么就会扰乱min的正常赋值,所以在给求min的时候要确保当前数组值不是0.
2.max-min可能小于2,当小于2的时候就不要进行质数判断了,这个条件不要漏掉了。
package LOQ.字符串;
import java.util.Scanner;
/*
笨小猴
*/
public class P1125 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//读取字符串
char[] chars = sc.nextLine().toCharArray();
//数组存放出现最多的字符次数 97-122之间
int[] arr = new int[123];
for(int i=0;i<chars.length;i++) {
arr[chars[i]]++;
}
//求最大出现次数和最小出现次数
int min=26,max=0;
for(int i=97;i<=122;i++) {
if(arr[i]>=max) {
max=arr[i];
}
if(arr[i]<=min && arr[i]!=0) { //确保min不会被赋予0,因为数组中未赋值的0会影响结果
min=arr[i];
}
}
if(getSu(min,max)) {
System.out.println("Lucky Word");
System.out.println(max-min);
} else {
System.out.printf("No Answer\n0");
}
}
public static boolean getSu(int min,int max) {
boolean flag=true;
if(max-min<2) return false; //当差值小于2时肯定不是素数,返回false
for(int i=2;i<max-min;i++) {
if((max-min)%i==0) {
flag=false;
}
}
return flag;
}
}