给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 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;
}