题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number
解题思路1
利用位运算来解
位运算符号:^
位运算作用:
a和b两个数,当他们的值相同的时候,a^b=0
当他们的值不同的时候,a^b=1
所以我们可以得到一个性质,假设一个数为N,一个数为0
那么肯定有N^0=N N^N=0
并且位运算是满足交换律和结合律的
就是说a^b=b^a (a^b)^c=a^(b^c)
我们利用上述性质来解题:
所以我们这里就利用偶数个的条件,设置一个变量eor=0,让它与数组中的所有元素进行位运算,最后得到的结果一一定是我们要找的那个出现一次的数字。
(偶数个的都通过^自身而全部抵消变成0了)
代码1
class Solution {
public:
int singleNumber(vector<int>& nums) {
int eor=0;//用来进行位运算的数字,初始化为0
for(int item:nums){//遍历nums数组
eor=eor^item;//让eor与数组中的每个元素位运算
}
return eor;//最后返回eor
}
};
解题思路2
1.特判:如果数组中只有一个元素,就直接返回该元素
2.否则的话就对数组排序一下,然后从0开始遍历,注意每次循环遍历i+=2。
如果nums[i]!=nums[i+1]
那么我们就找到了这个数是nums[i]
代码2
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.size()==1){//特判:数组中只有一个元素的情况
return nums[0];//直接返回该元素
}
sort(nums.begin(), nums.end());//对数组进行排序
for(int i=0;i<nums.size();i+=2){//遍历数组,注意每次遍历i+=2
if(nums[i]!=nums[i+1]){//如果当前元素不等于其临近的后面一个元素
return nums[i];//那么根据题意我们就找到了该元素
}
}
return 0;
}
};
这篇博客介绍了两种解决LeetCode上的《单数元素》问题的方法。第一种方法利用位运算,通过异或操作找出数组中只出现一次的数字,时间复杂度为线性。第二种方法是对数组进行排序,然后遍历找到第一个不重复的元素。这两种解法都避免了使用额外空间,满足题目要求。
333

被折叠的 条评论
为什么被折叠?



