【61.只出现一次的数字】

167 阅读1分钟

题目

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

输入: nums = [2,2,1]

输出: 1

题解

方式一:哈希表

public int singleNumber(int[] nums) {
    // 非线形额外空间,记录所有元素出现的次数
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
    }
    AtomicInteger result = new AtomicInteger();
    // 遍历找到只出现一次的元素
    map.forEach((k, v) -> {
        if (v == 1) {
            result.set(k);
        }
    });
    return result.get();
}

方式二:位运算

public int singleNumber(int[] nums) {
    // 0 与任意数 异或 等于原来的数
    int result = 0;
    for (int num: nums) {
        // 两个相同的数 异或 操作后等于0
        result ^= num;
    }
    return result;
}

总结

算法:位运算
数据结构:哈希表