这道题起始很简单,就是遍历,存储每个字符出现的次数。可以在存储次数的过程中得到最少次数,也可以增加一次遍历。
本次由三次循环修改到一次循环,回头看第一次写出了的三次循环,觉得自己脑回路有点长๐·°(৹˃̵﹏˂̵৹)°·๐。
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
/**
* Created by zfr on 2018/08/03.
* 寻找第一个出现次数最多的字符
* eg: abcaabb
* 输出:a
* 输入要求:字符串长度大于0
*
*/
public class 寻找出现次数最多的字符 {
public static void main(String[] args) {
// TODO Auto-generated method stub
寻找出现次数最多的字符 a = new 寻找出现次数最多的字符();
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
if(str == null || str.length() == 0 ){
System.out.println("输入有误!");
return ;
}
System.out.println(a.cal1(str));
System.out.println(a.cal2(str));
System.out.println(a.cal3(str));
}
//这道题第一直觉是三次循环
//第一次--找到每个字符出现的次数
//第二次找到出现次数最大的数
//第三次遍历字符串,找到第一个出现次数最多的字符
private char cal1(String str) {
Map<Character,Integer> map = new HashMap<>();
char[] ch = str.toCharArray();
for (int i = 0;i<ch.length;i++) {
if(map.containsKey(ch[i])){
map.put(ch[i],map.get(ch[i])+1);
}else {
map.put(ch[i],1);
}
}
int count = 0;
for (Entry<Character,Integer> entry:map.entrySet()) {
count = Math.max(count,entry.getValue());
}
for(char c : ch){
if(map.get(c) == count ){
return c ;
}
}
return ch[0];
}
//三次循环太多了 于是改成两次循环
private char cal2(String str) {
Map<Character,Integer> map = new HashMap<>();
char[] ch = str.toCharArray();
for (int i = 0;i<ch.length;i++) {
if(map.containsKey(ch[i])){
map.put(ch[i],map.get(ch[i])+1);
}else {
map.put(ch[i],1);
}
}
int index = -1 ;
char maxChar = ch[0];
for(int i = 0 ;i<ch.length;i++){
if(map.get(ch[i]) > index ){
index = map.get(ch[i]);
maxChar = ch[i] ;
}
}
return maxChar;
}
//两次循环也有点多 于是改成一次循环 => 其实就是逆序查找 从后往前查找
private char cal3(String str) {
Map<Character,Integer> map = new HashMap<>();
char[] ch = str.toCharArray();
int max = 0 ;
char res = ch[0] ;
for (int i = ch.length -1 ; i >= 0;i --) {
if(map.containsKey(ch[i])){
map.put(ch[i],map.get(ch[i])+1);
if(map.get(ch[i]) >= max ){
max = map.get(ch[i]);
res = ch[i] ;
}
}else {
map.put(ch[i],1);
}
}
return res ;
}
}
实验结果:
输入:abcbbaca
输出:
a
a
a