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