只出现过一次的数字ⅠⅡⅢ(简单的位运算)

在这里插入图片描述

class Solution {
public:
	int singleNumber(vector<int>& nums) {
		//典型的异或运算
		int res = 0;
		for (int i : nums)
		{
			res ^= i;

		}
		return res;
	}
};

这里插入一点题外话:
其实实现两个数的交换用位运算也很方便:

void swap(int&a, int&b)
{
	a = a^b;
	b = b^a;
	a = a^b;
}

在这里插入图片描述

class Solution {
public:
	vector<int> singleNumber(vector<int>& nums) {
		int length = nums.size();
		if (length <= 1)
			return{};
		int result_ExclusiveOR = 0;
		for (int i : nums)
		{
			result_ExclusiveOR ^= i;
		}
		//两个数不同,那么它们必然有一位是不同的,所以两个不同的数的这一位异或的结果为1
		int index = find_first_index_of_bit_1(result_ExclusiveOR);
		//按第index位分成两堆
		int temp1 = 0, temp2 = 0;
		for (int i : nums)
		{
			if (isBit1(i, index))
			{
				temp1 ^= i;

			}
			else
			{
				temp2 ^= i;

			}

		}
		vector<int>res;
		res.push_back(temp1);
		res.push_back(temp2);

		return res;


	}
	int find_first_index_of_bit_1(int number)
	{
		int index = 0;
		while (((number & 1) == 0) && index<8 * sizeof(int))
		{
			index++;
			number >>= 1;//右移一位
		}
		return index;
	}
	bool isBit1(int number, int index)
	{
		if (((number >> index) & 1) == 0)//注意&优先级比>>高
			return false;
		return true;

	}
};

在这里插入图片描述
这个思路就不是很好想到了:
在这里插入图片描述

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int a = 0, b = 0;
        for (auto num : nums)
        {
            a = (a ^ num) & ~b;
            b = (b ^ num) & ~a;
        }
        return a;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值