LeetCode——260. 只出现一次的数字 III(Java)

题目描述

题干:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 
找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:
输入:nums = [-1,0]
输出:[-1,0]

示例 3:
输入:nums = [0]

题解分析

返回只出现过一次的两个元素,而且还提示你能不能线性复杂度,所以第一个思路就是哈希表

当然这里题目设计的就很巧妙,为什么这里是两个唯一的数字,并且其他的数都是成对出现

如果熟悉位运算的同学就应该知道,一个数和自己的异或为0,所以该数组相互异或可想而知

就是两个唯一出现过一次的异或结果,根据这个规律大家可以自己尝试尝试怎么解决

正确代码

    public int[] singleNumber(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        int[] ans = new int[2];
        int index = 0;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                ans[index++] = entry.getKey();
            }
        }
        return ans;
    }

总结

题目设计的果然很精妙,这里还拓展了一种Map的遍历方式:Entry,以后可以更优雅了

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,最高处见
上一篇:260. 只出现一次的数字 III


下一篇:0123-买卖股票最佳时机III