资讯专栏INFORMATION COLUMN

面试题:寻找一个字符串中出现次数最多的字符以及出现的次数

lei___ / 2183人阅读

摘要:要求编写代码实现寻找一个字符串中出现次数最多的字符以及出现的次数。最后只需要在集合中找到值最大的即可。

要求编写代码实现:寻找一个字符串中出现次数最多的字符以及出现的次数。

解法一:用删除法实现 (挺巧妙的一种)
public class FindTheMostAppearChar {
  public static void main(String[] args) {
    deleteMethodToAchieve();
  }
  
    /**
     * 用删除法实现 (挺巧妙的)
     * 解题思路:每次取出字符串的第一个字符,将字符串中与第一个字符相同的字符全部删掉,
     * 然后通过计算删除前后字符串的长度来确定该字符在字符串出现的次数,最终比较出出现次数最多的字符
     */
    public static void deleteMethodToAchieve() {
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine().trim();
        scanner.close();
        int max_length = 0;
        String max_str = "";
        while (string.length() > 0) {
            String firstChar = string.substring(0,1);
            int length = string.length();
            string = string.replaceAll(firstChar, "");
            if (length - string.length() > max_length) {
                max_length = length - string.length();
                max_str = firstChar;
            }
        }
        System.out.println("出现次数最多的字符是:" + max_str + ",出现的次数:" + max_length);
    }
}
解法二:用查找法实现
public class FindTheMostAppearChar {
  public static void main(String[] args) {
    hashMapMethodToAchieve();
  }
  
    /**
     * 用字符数组查找法实现
     * 解题思路:先将字符串拆分成字符数组,然后转存到 HashMap 集合中,
     * 该集合的key为字符串中出现的字符,value为对应字符串出现的次数。
     * 最后只需要在HashMap集合中找到Value值最大的key即可。
     */
    public static void hashMapMethodToAchieve() {
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine().trim();
        scanner.close();
        // 将字符串转换成字符数组
        char[] arr = string.toCharArray();
        Map map = new HashMap<>();
        // key为出现的字符,value 为该字符出现的次数,将字符数组转存在 HashMap 中
        if (arr != null && arr.length > 0) {
            for (int i = 0; i < arr.length; i++) {
                if (map.get(arr[i]) != null) {
                    // 若不为空,说明已经存在相同的字符,则 value 值在原来的基础上加1
                    map.put(arr[i],map.get(arr[i]) + 1);
                } else {
                    map.put(arr[i], 1);
                }
            }
        }
      
          // 查找出出现次数最多的字符以及出现的次数也有多种写法
          FindTheMostCharByMap(map); // 查找写法一:用 Iterator 遍历 Map 来查找
          
        // FindTheMostCharByMapEntry(map); // 查找写法二:用 Map.Entry 提高效率
      
        // FindTheMostCharByForLoop(map, arr); // 查找写法三:直接用 for 循环来遍历查找
    }
  
  // 查找写法一:用 Iterator 遍历 Map 来查找
  public statice void FindTheMostCharByMap(Map map) {
        Set keys = map.keySet(); // 获取所有的key
        Iterator iterator = keys.iterator(); // 实例化 Iterator
        Character maxKey = (Character) iterator.next(); //定义第一个为最大的value和对应的key
        int maxValue = map.get(maxKey);
        while (iterator.hasNext()) {
            Character temp = (Character) iterator.next();
            if (maxValue < map.get(temp)) {
                maxKey = temp;
                maxValue = map.get(temp);
            }
        }
        System.out.println("出现次数最多的字符是:" + maxKey + ", 出现的次数:" + maxValue);
  }
  
  // 查找写法二:用 Map.Entry 提高效率
  public static void FindTheMostCharByMapEntry(Map map) {
        Iterator iterator = map.entrySet().iterator();
        Map.Entry entry = (Map.Entry) iterator.next();
        char maxKey = (char) entry.getKey(); // 获取key
        int maxValue = (int) entry.getValue(); // 获取value
        while (iterator.hasNext()) {
            entry = (Map.Entry) iterator.next();
            char tempKey = (char) entry.getKey();
            int tempValue = (int) entry.getValue();
            if (maxValue < tempValue) {
                maxKey = tempKey;
                maxValue = tempValue;
            }
        }
        System.out.println("出现次数最多的字符是:" + maxKey + ", 出现的次数:" + maxValue);
  }
    
  // 查找写法三:直接用 for 循环来遍历查找
  public static void FindTheMostCharByForLoop(Map map, char[] arr) {
        int maxValue = map.get(arr[0]);
        char maxKey = " ";
        for (int i = 0; i < arr.length; i++) {
            if (maxValue < map.get(arr[i])) {
                maxValue = map.get(arr[i]);
                maxKey = arr[i];
            }
        }
        System.out.println("出现次数最多的字符是:" + maxKey + ", 出现的次数:" + maxValue);
  }
  
}
解法三:用排序法实现
public class FindTheMostAppearChar {
  public static void main(String[] args) {
    sortMethodToAchieve();
  }
  
     /**
     * 用排序法实现
     * 解题思路:先将字符串转换成字符数组,然后对字符数组进行排序,
     * 统计每个字符重复出现的次数,最后比较得出出现次数最多的字符以及出现次数
     */
    public static void sortMethodToAchieve() {
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine().trim();
        scanner.close();
        char[] arr = string.toCharArray();
        Arrays.sort(arr); // 对数组进行排序
        char maxValue = "a"; // 记录出现次数最多的元素
        int maxCount = 0; // 记录出现次数
        int count = 1;
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i+1]) {
                count++;
            }
            if (arr[i] != arr[i+1]) {
                if (count > maxCount) {
                    maxCount = count;
                    maxValue = arr[i];
                }
                count = 1;
            }
        }
        System.out.println("出现次数最多的字符是:" + maxValue + ", 出现的次数:" + maxCount);
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77830.html

相关文章

  • 面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数找到出现次数数?

    摘要:这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如面试现场如何判断一个数是否在亿个整数中算法技巧位运算装逼指南对于算法题还是有点信心的,,,,于是,发现了如下对话。这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如 【面试现场】如何判断一个数是否在40亿个整数中? 【算法技巧】位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话。 20亿级别 面试...

    468122151 评论0 收藏0
  • 面试总结(给自己看

    摘要:记录水平垂直居中方法绝对定位方法绝对定位方法方法和的区别在文档流中没有,在文档流占据空间但不显示隐形是否继承不继承是否占据空间不占据空间页面属性更改是否重新渲染重新渲染忘了点击列表显示相应内容内容内容内容内容内容方法闭包方法事件代理布尔值是 20170913记录 1. 水平垂直居中 // 方法1: 绝对定位1 // 方法2: 绝对定位2 // 方法3: flex // 方法4: cs...

    mikyou 评论0 收藏0
  • JavaScript算法(附10道面试常见算法解决方法和思路)

    摘要:中的算法附道面试常见算法题解决方法和思路关注每日一道面试题详解面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度。值得记住的数组方法有和。一个好的解决方案是使用内置的方法。 JavaScript中的算法(附10道面试常见算法题解决方法和思路) 关注github每日一道面试题详解 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程...

    Cruise_Chan 评论0 收藏0
  • 常见大数据和空间面试

    摘要:答案使用,申请一个长度为类型的,每个位置只表示或,该数组占用空间约。遍历亿个数,当前数为,落在区间,对应。 过滤100亿黑名单 题目 假设有100亿个URL的黑名单,每个URL最多占用64B,设计一个过滤系统,判断某条URL是否在黑名单里。 要求 不高于万分之一的判断失误率;额外内存不超过30GB 答案 100亿个64B的URL需要640GB的内存,显然直接存哈希表不合理。考虑布隆过滤...

    Hydrogen 评论0 收藏0
  • 三道关于字符JavaScript面试解析

    摘要:方法二生成统计次数字符最多的是,出现了次点评稍微好一点。问题三题目如何给字符串加千分符例如方法一转换的方法转化为数组最终的结果点评将字符串转化为数组,然后对其切分重组。 分享几道js面试题,自己感觉还是挺重要的,当看到题目的时候希望大家先花几秒钟考虑一下,然后在看答案。如果有比较好的解法,欢迎大家留言指正,谢谢大家! 第一题 题目: 写一个字符串转换成驼峰的方法? 例如:borde...

    Sourcelink 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<