单词出现频率统计| 豆包MarsCode AI 刷题

64 阅读4分钟

学习方法与建议

在解决问题时,首先要明确问题的背景和所需的解决方案,特别是在处理字符串、数组或字典类问题时,能够有效地理解题目和选择合适的数据结构非常重要。下面我将介绍如何通过清晰的思路和代码实现来完成这类问题。

1. 问题理解

  • 本题要求统计英文句子中每个单词的出现次数,并按照字母顺序进行排序。这里需要注意几个点:

    • 输入是一个英文句子,单词间由空格分隔。
    • 输出要求按字母顺序输出单词及其出现次数,格式为 单词:次数
  • 需要用到字符串处理、哈希表、排序等基本操作。

2. 思路分析

  • 步骤一:分割字符串 首先,将输入字符串按空格分割成单词。这可以通过 split() 方法来实现,使用正则表达式 "\s+" 来处理多个连续的空格。
  • 步骤二:统计频率 使用 Map<String, Integer> 来记录每个单词出现的次数。可以通过 getOrDefault() 方法来获取已有单词的次数并加 1,或者新增该单词并初始化为 1。
  • 步骤三:排序 统计完成后,我们将 Map 转换成 List<Map.Entry<String, Integer>> 进行排序。排序的依据是单词的字母顺序,因此我们可以使用 Map.Entry.comparingByKey() 来按字母顺序排序。
  • 步骤四:格式化输出 最后,根据排序后的 Map 条目生成需要的输出格式,即 单词:次数,并将其添加到结果列表中返回。

3. 代码详解

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
​
public class Main {
    public static List<String> solution(String s) {
        String[] words = s.split("\s+");  // 正则表达式匹配一个或多个空格
​
        Map<String, Integer> wordCount = new HashMap<>();
        for (String word : words) {
            wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); // 统计频率
        }
​
        List<Map.Entry<String, Integer>> entries = new ArrayList<>(wordCount.entrySet());
        entries.sort(Map.Entry.comparingByKey()); // 按字母顺序排序
​
        List<String> result = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : entries) {
            result.add(entry.getKey() + ":" + entry.getValue()); // 格式化输出
        }
​
        return result; // 返回结果
    }
​
    public static void main(String[] args) {
        System.out.println(solution("New to Python or choosing between Python 2 and Python 3 Read Python 2 or Python 3")
                .equals(List.of("2:2", "3:2", "New:1", "Python:5", "Read:1", "and:1", "between:1", "choosing:1", "or:2", "to:1")));
        System.out.println(solution("hello world hello python").equals(List.of("hello:2", "python:1", "world:1")));
        System.out.println(solution("the quick brown fox jumps over the lazy dog")
                .equals(List.of("brown:1", "dog:1", "fox:1", "jumps:1", "lazy:1", "over:1", "quick:1", "the:2")));
    }
}

代码分析:

  1. split() split("\s+") 是将字符串按空白字符分割开,并且能够处理多个连续的空格。
  2. wordCount.put() put() 方法用于将单词和它的频率存储在哈希表中,getOrDefault() 方法能确保在单词不存在时能自动初始化为 0,避免了空指针异常。
  3. entries.sort(Map.Entry.comparingByKey()) 使用 Map.EntrycomparingByKey() 方法按字母顺序对 Map 中的条目进行排序。这是因为我们需要按字母顺序输出单词。
  4. result.add(entry.getKey() + ":" + entry.getValue()) 将每个单词和其出现次数格式化为 单词:次数 形式,并添加到结果列表。

4. 学习总结与经验

  • 哈希表(Map)的运用:哈希表是处理频率统计问题的常用工具,通过键值对存储单词及其计数。了解 Map 中常用方法的应用,如 getOrDefault()put(),以及如何从 Map 转换为列表进行排序等,可以在实际编程中事半功倍。
  • 字符串处理:在处理字符串时,特别是处理输入时的分割和正则表达式的使用非常重要。split("\s+") 就是解决多空格问题的常用手段。
  • 排序:理解如何按键排序字典中的条目(Map.Entry),这是许多题目中常见的操作,尤其是当你需要按某些特定顺序输出时。

5. 学习方法与建议

  • 基础数据结构学习:掌握 HashMapListSet 等常见的数据结构,了解它们的基本操作和应用场景。
  • 字符串和正则表达式:在解决字符串相关问题时,掌握常见的字符串操作和正则表达式是非常有帮助的。定期练习这部分内容。
  • 排序算法的理解:了解如何进行排序,特别是在处理 MapList 时,掌握常见的排序方法,如 comparingByKey() 和自定义排序规则。
  • 编写清晰的代码:写出具有良好可读性的代码是非常重要的,尤其是在处理多步骤的复杂问题时,合理分解每一步的逻辑,注重代码的可维护性。

通过持续不断的实践和总结,不仅能提高问题解决的速度,也能更好地应对未来的挑战。