题目:找出字符串中出现次数最多的字符和次数。
例如:“abbcdaaca”中出现次数最多的字符就是a,出现次数是4
思路
由于需要找出字符和次数,这里可以利用Map键值对的形式来存储,先通过遍历字符串并比较字符,如果Map中已经存在该字符就修改相对应的value值,也就是每次发现相同的字符就value++,这样就得出了字符串中所有字符以及相对应出现的次数的键值对对象。最后通过遍历Map和比较找出出现次数最多的字符即可。
HashMap<Character,Integer> map = new HashMap<Character,Integer> ();
//获取到字符串的字符和出现的次数的键值对对象
for(int i=0;i<str.length();i++)
{
char temp = str.charAt(i);
if(map.containsKey(temp))
{
map.put(temp,map.get(temp)+1);//如果map中已经存在就重新改变对应的value值+1
}
else
{
map.put(temp,1);
}
}
获取到Map对象通过遍历比较找出出现次数最对的键值对
int count = 0;
Character temp = null;
for (Map.Entry<Character,Integer> entry:map.entrySet()
) {
if(entry.getValue()>count)
{
count = entry.getValue();
temp = entry.getKey();
}
}
System.out.println("出现最多次的字符是:"+temp);
System.out.println("出现次数:"+count);
有个问题要解决
如果字符串是“aaaabbbbcc”,出现次数相同并且都是最多的那怎么办呢?
这里我觉得可以再创建一个teamMap来存放出现次数最多有多个的情况,然后每次返回结果前就去看teamMap是否存在两个或多于两个的情况,存在的话就都打印出来。
int count = 0;
Character temp = null;
//存放临时结果的map
HashMap<Character,Integer> tempMap = new HashMap<Character, Integer>();
for (Map.Entry<Character,Integer> entry:map.entrySet()
) {
if(entry.getValue()>count&&tempMap.isEmpty())
{
count = entry.getValue();
temp = entry.getKey();
tempMap.put(temp,count);
}
else if (entry.getValue()>count&&!tempMap.isEmpty())
{
tempMap.clear();//存在次数更多的字符,直接清空之前的元素
count = entry.getValue();
temp = entry.getKey();
tempMap.put(entry.getKey(),entry.getValue());
}
else if(entry.getValue()==count)
{
tempMap.put(entry.getKey(),entry.getValue());
}
}
if(tempMap.size()>1)
{
System.out.println("出现最多次数的字符有多个法,分别是:");
for (Map.Entry<Character,Integer>entry:tempMap.entrySet()
) {
System.out.println(entry.getKey());
}
}
else
{
System.out.println("出现最多次的字符是:"+temp);
}
完整代码
public static void getMaxTimeChar(String str)
{
HashMap<Character,Integer> map = new HashMap<Character,Integer> ();
//获取到字符串的字符和出现的次数的键值对对象
for(int i=0;i<str.length();i++)
{
char temp = str.charAt(i);
if(map.containsKey(temp))
{
map.put(temp,map.get(temp)+1);//如果map中已经存在就重新改变对应的value值+1
}
else
{
map.put(temp,1);
}
}
int count = 0;
Character temp = null;
HashMap<Character,Integer> tempMap = new HashMap<Character, Integer>();
for (Map.Entry<Character,Integer> entry:map.entrySet()
) {
/* System.out.println(entry.getKey());
System.out.println(entry.getValue());*/
if(entry.getValue()>count&&tempMap.isEmpty())
{
count = entry.getValue();
temp = entry.getKey();
tempMap.put(temp,count);
}
else if (entry.getValue()>count&&!tempMap.isEmpty())
{
tempMap.clear();
count = entry.getValue();
temp = entry.getKey();
tempMap.put(entry.getKey(),entry.getValue());
}
else if(entry.getValue()==count)
{
tempMap.put(entry.getKey(),entry.getValue());
}
}
if(tempMap.size()>1)
{
System.out.println("出现最多次数的字符有多个,分别是:");
for (Map.Entry<Character,Integer>entry:tempMap.entrySet()
) {
System.out.println(entry.getKey());
}
System.out.println("出现次数是:"+count);
}
else
{
System.out.println("出现最多次的字符是:"+temp+">>>>>>>>出现次数:"+count);
}
}
引申:如果要找出第二多字符怎么实现呢?
无外乎就是在遍历的时候再多进行一次比较,可以分别创建最大和第二的两个变量来存储,然后在比较的时候再增加一层else if.
int maxCount = 0
Character maxChar= null;
int secCount = 0;
Character secChar= null;
if(entry.getValue>maxCount)
{
maxCount = entry.getValue();
maxChar = entry.getKey();
}else if(entry.getValue>secCount)
{
secCount = entry.getValue();
secChar = entry.getKey();
}
上次面试的时候被问到了,所以在这里做个记录。加油。