1. 程式人生 > 其它 >LeetCode——260. 只出現一次的數字 III(Java)

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,以後可以更優雅了

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,最高處見