📜  散列练习题(1)

📅  最后修改于: 2023-12-03 14:54:51.938000             🧑  作者: Mango

散列练习题

简介

散列,又称哈希表,是一种数据结构,它可以快速地查找、插入或删除数据。散列的核心思想是利用一个函数把数据映射到一个固定范围的整数,这个整数就作为数组的下标,从而实现快速的访问。散列的查找、插入和删除操作的时间复杂度通常为 O(1)。

练习题

散列是一个非常实用的数据结构,下面是一些散列练习题,可以帮助程序员巩固散列的使用。

1. 两数之和

给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。

示例:

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int complement = target - nums[i];
        if (map.containsKey(complement)) {
            return new int[] { map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

思路: 通过遍历数组,将每个元素作为键,下标作为值存放到散列表中。对于每个要查找的元素,通过计算目标值减去当前元素得到差值,然后在散列表中查找该差值是否存在,如果存在,则返回它们的下标。

时间复杂度:O(n)。

2. 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 n/2 的元素。

示例:

public int majorityElement(int[] nums) {
    int count = 0;
    Integer candidate = null;
    for (int num : nums) {
        if (count == 0) {
            candidate = num;
        }
        count += (num == candidate) ? 1 : -1;
    }
    return candidate;
}

思路:通过遍历数组,使用计数器统计出现次数,并记录当前出现次数最多的元素,最终返回这个元素即可。

时间复杂度:O(n)。

3. 数组交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例:

public int[] intersect(int[] nums1, int[] nums2) {
    Map<Integer, Integer> map = new HashMap<>();
    List<Integer> result = new ArrayList<>();
    // 统计nums1中元素的出现次数
    for (int num : nums1) {
        map.put(num, map.getOrDefault(num, 0) + 1);
    }
    // 遍历nums2,如果元素在nums1中出现,则加入结果数组,并减少nums1中对应元素的出现次数
    for (int num : nums2) {
        if (map.containsKey(num) && map.get(num) > 0) {
            result.add(num);
            map.put(num, map.get(num) - 1);
        }
    }
    // 将结果数组转换成整数数组
    int[] resultArray = new int[result.size()];
    for (int i = 0; i < result.size(); i++) {
        resultArray[i] = result.get(i);
    }
    return resultArray;
}

思路: 先遍历一个数组,将其中元素的出现次数存储到散列表中。然后再遍历另一个数组,对于其中的每个元素,如果在散列表中出现过,则加入结果数组并将散列表中该元素的出现次数减一。

时间复杂度: O(m+n),其中 m 和 n 分别为两个数组的长度。

总结

散列表是一种非常实用的数据结构,可以用来解决很多常见的问题。掌握散列表的基本概念和常见的操作,对于程序员的职业发展是非常有帮助的。