返回

日拱算法:别只找到一个没出现过的数字,让我统计所有的!

前端

日拱算法:只出现一次的数字

作为一名算法爱好者,我不断挑战自己的极限,力求解锁更多算法难题。最近,我被一道题难住了:给定一个整数数组,如何找到其中只出现一次的数字?

一番苦思冥想后,我终于悟出了这道题的精髓:利用哈希表来记录每个数字出现的次数,然后遍历哈希表,找出只出现一次的数字即可。

哈希表闪亮登场

哈希表是一种高效的数据结构,可以快速查找、插入和删除元素。它的工作原理是将元素映射到一个哈希值,然后将元素存储在哈希值对应的存储位置上。这样,查找一个元素时,只需要计算它的哈希值,然后直接跳转到对应的存储位置即可。

我的算法详细解析

有了哈希表打底,我的算法就变得轻而易举了:

  1. 首先,创建一个哈希表,将数组中的每个元素作为键,出现的次数作为值存储到哈希表中。
  2. 然后,遍历哈希表,找出值等于1的键,这些键就是只出现一次的数字。
  3. 最后,将这些只出现一次的数字收集起来,形成一个新的数组,并返回这个数组。

代码实现

import java.util.HashMap;

class Solution {
    public int[] singleNumber(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();

        // 统计每个数字出现的次数
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }

        // 找出只出现一次的数字
        ArrayList<Integer> result = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                result.add(entry.getKey());
            }
        }

        // 将结果数组转换成基本类型数组并返回
        return result.stream().mapToInt(i -> i).toArray();
    }
}

算法优势

我的算法具有以下优势:

  • 时间复杂度为O(n),其中n为数组的长度。这是因为哈希表可以实现快速查找、插入和删除元素。
  • 空间复杂度也为O(n),因为哈希表需要存储n个元素。

扩展应用

我的算法不仅可以用于统计只出现一次的数字,还可以用于统计出现多次的数字、统计最大值和最小值等。

结语

日拱算法让我体会到了算法之美,也让我对自己的能力有了新的认识。我相信,只要不断努力,不断学习,我一定能够在算法领域取得更大的成就。