题目为 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
一开始我的思路是对数组排序,然后遍历,比较数组前一个和后一个是否都不相等。代码如下
public int SingleNumber(int[] nums)
{
if (nums.Count()==1)
{
return nums[0];
}
nums = nums.OrderBy(e=>e).ToArray();
if (nums[0]!=nums[1])
{
return nums[0];
}
if (nums[nums.Count()-1]!= nums[nums.Count() - 2])
{
return nums[nums.Count() - 1];
}
for (int i = 1; i < nums.Count()-2; i++)
{
if (nums[i]!=nums[i-1]&&nums[i]!=nums[i+1])
{
return nums[i];
}
}
return 0;
}
看了官方题解 使用异或运算,因为每个数字要么出现一次,要么出现两次。
可使用异或运算 ⊕。异或运算有以下三个性质。
public int SingleNumber(int[] nums)
{
int ret = 0;
foreach (int e in nums) ret ^= e;
return ret;
}