技术面试通常会提出一些问题来测试您对集合的理解,尤其是HashMaps。一个常见的挑战涉及计算列表中元素的出现次数。这个问题可以帮助面试官评估您有效处理数据聚合并避免NullPointerException等陷阱的能力。
如果您是 HashMap 新手,在深入研究本文之前,您可能需要查看我的破解 HashMap 基础知识:Java 开发人员的关键概念 了解基础知识。
在这篇文章中,我们将:
您将获得一个整数列表,您的任务是返回每个唯一数字及其在列表中出现的次数。这是一个典型的问题,考验你对HashMap数据结构的理解以及高效实现它的能力。
这是一个例子:
[1, 2, 3, 5, 2, 1]
{1=2, 2=2, 3=1, 5=1}
如果输入列表为空或空,结果应返回一个空的HashMap。
在此解决方案中,我们手动检查HashMap是否已包含数字作为键。如果是,我们增加该值;如果没有,我们插入值为 1 的键。
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class CountNumbers { private HashMapgetCount(List list) { // Initialize HashMap to store number counts HashMap map = new HashMap(); // To avoid NullPointerException in case of a null list if (list != null) { // Iterate through each number in the list for (int num : list) { // If first occurrence, add number with count 1 if (!map.containsKey(num)) { map.put(num, 1); } else { // If the number already exists, increment its count by 1 map.put(num, map.get(num) 1); } } } return map; } public static void main(String[] args) { // Using ArrayList Parameterized Constructor with Collection as argument List numbers = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // Result -> {} System.out.println(nums.getCount(numbers)); // Result -> {1=2, 2=2, 3=1, 5=1} } }
时间复杂度:
空间复杂度:O(n) – 在最坏的情况下,所有数字都是唯一的并存储在 HashMap 中。
Java HashMap 类提供了更干净、更简洁的方式用 getOrDefault() 方法来处理这个问题。如果在映射中找不到键,它会通过返回 默认值 来消除对 if-else 逻辑的需要。
V getOrDefault(Object key, V defaultValue)
参数:
返回:指定键映射到的值,如果映射不包含该键的映射,则返回 defaultValue。
更多信息可以查看HashMap官方Javadoc。
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class CountNumbers { private HashMapgetCount(List list) { // Initialize HashMap to store number counts HashMap map = new HashMap(); // To avoid NullPointerException in case of a null list if (list != null) { // Iterate through each number in the list for (int num : list) { // Cleaner solution using getOrDefault() map.put(num, map.getOrDefault(num, 0) 1); } } return map; } public static void main(String[] args) { // Using ArrayList Parameterized Constructor with Collection as argument List numbers = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // Result -> {} System.out.println(nums.getCount(numbers)); // Result -> {1=2, 2=2, 3=1, 5=1} } }
方面 | 传统方法 | 使用 getOrDefault() |
---|---|---|
代码可读性 | if-else 逻辑稍显冗长更干净、更简洁 | |
表现 | 相同 (O(n))相同 (O(n)) | |
用例 | 适用于所有 Java 版本需要 Java 8 或更高版本 |
使用 getOrDefault() 使代码更加简洁和可读。这个问题是面试中常见的问题,因为它评估您对 HashMap、迭代和处理空值 的理解。它还与涉及频率计数和数据聚合的问题密切相关。
如果您发现这篇文章有帮助,请务必查看 Collections Framework Essentials 系列中的其他文章!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3