南阳OJ-题目241:字母统计

本文介绍了一个简单的编程挑战——字母统计问题,并提供了两种不同的Java实现方案。任务要求从给定的小写字符串中找出出现频率最高的字母,若多个字母出现频率相同,则输出字母表中顺序最前的一个。文章详细展示了如何通过读取输入、统计每个字母出现的次数并确定最高频字母的具体步骤。

题目描述:

字母统计

时间限制: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;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值