《LeetCode之每日一题》:193.只出现一次的数字 III

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:193.只出现一次的数字 III相关的知识,希望对你有一定的参考价值。

只出现一次的数字 III


题目链接: 只出现一次的数字 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]

提示:

2 <= nums.length <= 3 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
除两个只出现一次的整数外,nums 中的其他数字都出现两次

题解

法一:哈希表

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        unordered_map<int, int> mp;
        for (auto num : nums)
        {
            ++mp[num];
        }

        vector<int> ans;
        for (const auto &[num, occ] : mp)
        {
            if (occ == 1)
                ans.push_back(num);
        }
        return ans;
    }
};


法二:位运算之异或
异或的性质
代码一:lowbit
参考官方题解

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xorsum = 0;
        for (auto &num : nums)
        {
            xorsum ^= num;
        }

        //in order to get the Least Significant Bit
        int lsb = (xorsum == INT_MIN) ? INT_MIN : (xorsum & (-xorsum));
        int num1 = 0, num2 = 0;
        for (auto &num : nums)
        {
            if (lsb & num)
                num1 ^= num;
            else 
                num2 ^= num;
        }

        return {num1, num2};
    }
};

代码二:使用异或进行划分

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xorsum = 0;
        for (auto &num : nums)
        {
            xorsum ^= num;
        }

        //找到两个单身数字相同比特位上相异的位置
        int pos = -1;
        for (int i = 31; i >= 0; i--)
        {
            if (((xorsum >> i) & 1) == 1)
            {
                pos = i;
                break;
            }
        }

        //按照相同比特位置上的位置差异,进行划分
        int num1 = 0, num2 = 0;
        for (auto &num : nums)
        {
            if ((num >> pos) & 1)
                num1 ^= num;
            else 
                num2 ^= num;
        }

        return {num1, num2};
    }
};

以上是关于《LeetCode之每日一题》:193.只出现一次的数字 III的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:125.有效的数独

《LeetCode之每日一题》:121.有序数组中的单一元素

《LeetCode之每日一题》:288.删除排序链表中的重复元素

《LeetCode之每日一题》:288.删除排序链表中的重复元素

《LeetCode之每日一题》:98.删除排序链表中的重复元素

leetcode每日一题