#输出频率最高且最先出现的字符#

假设有一个字符串,字符串内部的所有字符都是在ascii编码的范围内,编码求出字符串中出现频率最高的字符,如果频率最高的字符有几个字符出现的频率一样,则输出最先出现的字符。

 

如输入串为 “hello world, every body!”,则输出频率最高且最先出现的字符。

方法定义:char getMaxOccurChar(String str)

输入:hello world, every body!

输出:e

输入:aaaahfdfbbbbbbbbbb

输出:b

 

算法爱好者  贴出的思路

public class Main {

    public static void main(String[] args) {
        char result = getMaxOccurChar("hello world, every body!");
        // e
        System.out.println(result);
        result = getMaxOccurChar("aaaahfdfbbbbbbbbbb");
        // b
        System.out.println(result);
    }

    public static char getMaxOccurChar(String str) {

        int maxCount = 1;
        Character result = new Character(str.charAt(0));

        Map<Character, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < str.length(); i++) {
            Character content = str.charAt(i);
            Integer count = map.get(content);
            if (count == null) {
                map.put(content, 1);
            } else {
                map.put(content, count + 1);
            }
        }

        for (Map.Entry<Character, Integer> entry: map.entrySet()) {
            if (entry.getValue() > maxCount) {
                result = entry.getKey();
                maxCount = entry.getValue();
            }
        }
        return result;
    }
}

 

我想到另一种只需一次遍历的思路

private static char getMaxOccurChar(String str) {
    char[] chars = str.toCharArray();
    int minIndex = 0;
    int maxCount = 0;
   for(int x = 0; x < chars.length; x++){
     Pattern compile = Pattern.compile(String.valueOf(chars[x]));
     Matcher matcher = compile.matcher(str);
     int count = 0;
     while(matcher.find()){
       count++;
     }
     //数量大于
     if(count >  maxCount){
       maxCount = count;
       minIndex = x;
     }
     //数量一致
     else if(count == maxCount && minIndex > x){
       minIndex = x;
     }
   }
    return chars[minIndex];
  }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值