题目描述:
字母统计
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
描述
现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个。
输入
第一行输入一个正整数T(0<T<25)
随后T行输入一个字符串s,s长度小于1010。
输出
每组数据输出占一行,输出出现次数最多的字符;
样例输入
3
abcd
bbaa
jsdhfjkshdfjksahdfjkhsajkf
样例输出
a
a
j
运行代码:
1.我的代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
* Dragon 2017.8.31
* 字母统计
*/
public class Num_241 {
public static void main(String[] args) throws NumberFormatException, IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int t=Integer.parseInt(in.readLine());
while(t-->0)
{
String input=in.readLine();
int[] letter=new int[27];//从1开始
GetResult(input,input.length(),letter);
int index=FindChar(letter);
System.out.printf("%c\n",(index+96));
}
}
//从字符串中记录每一个字符出现的次数,保存在letter数组中
private static void GetResult(String input, int len, int[] letter)
{
for(int i=0;i<len;i++)
{
int index=input.charAt(i)-96;
letter[index]++;
//System.out.println("#字母:"+input.charAt(i)+"的次数为:"+letter[index]);
}
}
//从letter字母数组中找到次数最多(包括最小的情况)的字母,返回letter中的下标
private static int FindChar(int[] letter)
{
int max=letter[1];
int index=1;
for(int i=2;i<27;i++)
{
if(max<letter[i])
{
max=letter[i];
index=i;
}
}
//System.out.println("经过搜索,下标最大的是:"+index);
return index;
}
}
2.更快更简洁的代码,思路相同
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) throws Exception
{
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
int nn = Integer.parseInt(cin.readLine());
while(nn-- >0)
{
String str = cin.readLine();
char[] ch = str.toCharArray();
System.out.println((char)tongji(ch));
}
}
static int tongji (char[] ch)
{
int[] sum = new int[27];
for(int x=0; x<ch.length; x++)
sum[ch[x]-97]++; //a sum[0] +++
int max = 0;
for(int y=0; y<sum.length-1; y++)
if(sum[max]<sum[y+1]) max=y+1;
return max+97;
}
}