LeetCode笔试题 Single Number

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

 下面程序是利用unordered_map解问题
 

int singleNumber(vector<int>& nums)
{
	//建立一个无序单重映射表
	unordered_map<int, bool> m;
	//遍历vec,如果map表中找到当前vec的元素,给value设置标志位true表示该数字有重复。
	//没有就将其放入map表中,并且给value设置标志位false表示该数字目前无重复。
	for (int i = 0; i < nums.size(); ++i)
	{
		if (m.find(nums[i]) != m.end())
		{
			m[nums[i]] = true;
		}
		else
		{
			m[nums[i]] = false;
		}
	}	
	//遍历map表通过value找key
	for (auto it = m.begin(); it != m.end(); ++it)
	{
		if (!it->second)
		{
			return it->first;
		}
	}
	return -1;
}

int main()
{

	vector<int>num = { 0,0,0,0,1,1,1,1,2,2,2,2,3};
	int i = singleNumber(num);
	cout << i << endl;
	getchar();
	return 0;
}

利用位运算解决问题 

/*  算法思想:巧妙使用位运算解决,根据异或运算的
    性质,将所有数字异或后,相同的数字抵消,剩下
    的数字即为只出现了一次的数字
*/
int singleNumber(int* nums, int numsSize)
{
	if (nums == NULL || numsSize <= 0)
	{
		return -1;
	}
	int result = 0;
	for (int i = 0; i < numsSize; i++)
	{
		result ^= nums[i];
	}
	return result;
}

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/89677723