列表

详情


260. 只出现一次的数字 III

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

 

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

 

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [0,1]
输出:[1,0]

提示:

相似题目

只出现一次的数字

只出现一次的数字 II

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> singleNumber(vector<int>& nums) { } };

java 解法, 执行用时: 0 ms, 内存消耗: 43.3 MB, 提交时间: 2023-10-16 09:20:18

class Solution {
    public int[] singleNumber(int[] nums) {
        int xorAll = 0;
        for (int x : nums) {
            xorAll ^= x;
        }
        int tz = Integer.numberOfTrailingZeros(xorAll);
        int[] ans = new int[2];
        for (int x : nums) {
            ans[x >>> tz & 1] ^= x;
        }
        return ans;
    }
}

rust 解法, 执行用时: 0 ms, 内存消耗: 2.3 MB, 提交时间: 2023-10-16 09:19:53

impl Solution {
    pub fn single_number(nums: Vec<i32>) -> Vec<i32> {
        let xor_all = nums.iter().fold(0, |xor, &x| xor ^ x);
        let tz = xor_all.trailing_zeros();
        let mut ans = vec![0, 0];
        for &x in &nums {
            ans[x as usize >> tz & 1] ^= x;
        }
        ans
    }
}

cpp 解法, 执行用时: 8 ms, 内存消耗: 10.1 MB, 提交时间: 2023-10-16 09:19:28

class Solution {
public:
    vector<int> singleNumber(vector<int> &nums) {
        unsigned int xor_all = 0;
        for (int x: nums) {
            xor_all ^= x;
        }
        int lowbit = xor_all & -xor_all;
        vector<int> ans(2);
        for (int x: nums) {
            ans[(x & lowbit) != 0] ^= x; // 分组异或
        }
        return ans;
    }
};

golang 解法, 执行用时: 8 ms, 内存消耗: 4.6 MB, 提交时间: 2022-11-16 11:01:00

func singleNumber(nums []int) (ans []int) {
    freq := map[int]int{}
    for _, num := range nums {
        freq[num]++
    }
    for num, occ := range freq {
        if occ == 1 {
            ans = append(ans, num)
        }
    }
    return
}

golang 解法, 执行用时: 8 ms, 内存消耗: 3.8 MB, 提交时间: 2022-11-16 11:00:42

func singleNumber(nums []int) []int {
    xorSum := 0
    for _, num := range nums {
        xorSum ^= num
    }
    lsb := xorSum & -xorSum
    type1, type2 := 0, 0
    for _, num := range nums {
        if num&lsb > 0 {
            type1 ^= num
        } else {
            type2 ^= num
        }
    }
    return []int{type1, type2}
}

python3 解法, 执行用时: 36 ms, 内存消耗: 16.2 MB, 提交时间: 2022-11-16 11:00:13

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        xorsum = 0
        for num in nums:
            xorsum ^= num
        
        lsb = xorsum & (-xorsum)
        type1 = type2 = 0
        for num in nums:
            if num & lsb:
                type1 ^= num
            else:
                type2 ^= num
        
        return [type1, type2]

python3 解法, 执行用时: 44 ms, 内存消耗: 16.5 MB, 提交时间: 2022-11-16 10:56:53

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        freq = Counter(nums)
        return [num for num, occ in freq.items() if occ == 1]

上一题