На технических собеседованиях часто встречаются вопросы, проверяющие ваше понимание коллекций, особенно HashMaps. Одна из распространенных проблем связана с подсчетом вхождений элементов в список. Этот вопрос помогает интервьюерам оценить вашу способность эффективно обрабатывать агрегацию данных и избежать таких ошибок, как NullPointerException.
Если вы новичок в HashMaps, возможно, вы захотите ознакомиться с моим Cracking the Basics of HashMap: Key Concepts for Java Developers для получения базовых знаний, прежде чем углубляться в этот пост.
В этом посте мы:
Вам дан список целых чисел, и ваша задача — вернуть каждое уникальное число вместе с количеством его вхождений в список. Это типичная задача, которая проверяет ваше понимание структуры данных HashMap и вашу способность эффективно ее реализовать.
Вот пример:
[1, 2, 3, 5, 2, 1]
{1=2, 2=2, 3=1, 5=1}
Если входной список имеет значение NULL или пуст, результат должен возвращать пустой 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)
Параметры:
Возвращает: значение, с которым сопоставлен указанный ключ, или значение по умолчанию, если сопоставление не содержит сопоставления для ключа.
Для получения дополнительной информации вы можете проверить официальную документацию Java для HashMap.
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() делает код более кратким и читабельным. Этот вопрос является наиболее популярным на собеседованиях, поскольку он оценивает ваше понимание HashMaps, итерации и обработки нулевых значений. Это также тесно связано с проблемами, связанными с подсчетом частоты и агрегированием данных.
Если этот пост оказался для вас полезным, обязательно прочтите и другие посты из серии «Основы Collections Framework»!
Основы Java
Основы собеседования с Array
Основы памяти Java
Удачного программирования!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3