题目
[问题描述] x星球有26只球队,分别用a~z的26个字母代表。他们总是不停地比赛。在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了) [输入形式] 输入,一个串,表示球队获胜情况(保证串的长度<1000) [输出形式] 输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。 [样例输入]
abaabcaa
[样例输出]
4
[样例说明]
a出现5次,最多;c出现1次,最少。5-1=4
解题思路
我们可以把这一题看成为一个简单的桶排序实例;我们可以把26个字母定义一个字符串,然后再去定义一个与之长度想对应的数组;然后再用字符匹配的数组的相对位置,在相对位置处+1;当字符串遍历结束时,就可以算出来每个字符出现的次数,然后对数组进行升序排列,当排列结束后,我们的球队可能不足26队,然后我们遍历数组,当数组值不为0的时候,用数组的最后一位来减去当前不为0的数组位置,就能得到获胜次数最多的和获胜次数最少的球队之间的获胜场数的差距。
代码实现
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static String a="abcdefghijklmnopqrstuvwxyz";
static int[] b=new int[26];
static String c;
public static void main(String[] args) {
for (int i=0;i<26;i++){
b[i]=0;
}
Scanner scan=new Scanner(System.in);
c= scan.next();
for (int i=0;i<c.length();i++){
for (int j=0;j<a.length();j++){
if (c.charAt(i)==a.charAt(j)){
b[j]++;
break;
}
}
}
Arrays.sort(b);
for (int i=1;i<26;i++){
if (b[i]!=0){
System.out.println(b[25]-b[i]);
break;
}
}
}
}
|