寻找字符串中出现次数最多的字符java

今天去一家公司面试,遇到一道面试题。开始以为很简单,飞快地写完了给面试官看,面试官一下就挑出了问题,当时太紧张,没想出来怎么解决,回来后觉得这么简单的题都做不出来,还怎么做一个优秀的程序员。花了30分钟,轻松解决。

首先这道面试题初一看很简单,寻找出字符串中出现次数最多的字符,例如:aaaaaac,输出a;如果出现次数一样多,那么输出先达到次数的字符,例如:abcdefghijklba,输出b(变种:输出先出现的字符,其实解决思路一样)。我看网上很多回答都是用HashMap,但是找出最大值后,如果有多个最大值你怎么找到最先达到次数的字符呢?很多人就会想,再弄一个数组或者HashMap记录下他最后出现的位置,如果你真这么想,那么你的算法就是一坨屎。这道题目得换一种角度来思考!!!

我们在刚开始遍历字符串记录次数的时候,能不能顺便就记下他的位子呢?如果你这么想,那么这道题目就迎刃而解了。我的想法是,用两个list,一个记他的顺序,另一个记他的次数,他们的index是对应的。话不多说,我们看代码:

import java.util.ArrayList;
import java.util.List;
/**
 * 
 * @author Lance
 *
 */
public class FindCharTest {
	public static void main(String[] args) {
          String s="abcdefghijklba";
          System.out.println(findCharMost(s));
	}
	public static char findCharMost(String s) {
		//记录字符串中的字符
		List<Character> list=new ArrayList<>();
		//记录对应字符出现的次数
		List<Integer> list2=new ArrayList<>();
		//因为题目要求最先达到次数,那么我就倒着来遍历字符串
		//那么记录顺序的list中就有字符串的顺序了
		for(int i=s.length()-1;i>=0;i--){
			if(!list.contains(s.charAt(i))) {
				//如果字符没有出现过,那么add到list中
			    list.add(s.charAt(i));
			    //同时在list2对应位置赋值为1
			    list2.add(1);
			}else {
				//如果字符出现过,那么找到其对应的index
				int index=list.indexOf(s.charAt(i));
				//在list2对应位置将次数++
				list2.set(index,list2.get(index)+1);
			}
		}
		int max=list2.get(list2.size()-1);
		int j=list2.size()-1;
		//记录顺序的list中是按后到的字符放在前面的顺序
		//所以我们只要倒着遍历找到最大值就可以了
		for(int i=list2.size()-2;i>=0;i--){
			if(list2.get(i)>max){
				max=list2.get(i);
				j=i;
			}
		}
		return list.get(j);
	}
}

转载请声明出处和作者,谢谢!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值