给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
根据给出条件,一个数组,除了一个元素出现一次,其他元素均是成对出现;
线性时间复杂度:时间复杂度最高为O(n)
不使用额外空间:要求空间复杂度最高为O(1)。
思路一:可以将数组排序,然后两个指针进行遍历即可:该数经过排序后肯定为偶数
class Solution {
public:
int singleNumber(vector<int>& nums) {
sort(nums.begin(),nums.end()); // 先进行排序
for(int i = 0; i < nums.size() - 1 ; i= i + 2)
{
if(nums[i]!=nums[i+1]) // 找到不相等的一组,直接返回 /两个指针进行遍历
{
return nums[i];
}
}
return nums[nums.size()-1]; // 如果没有找到不相等的一组数据,直接返回数组的最后一个数字
}
};
2:可以考虑异或,异或同一个数两次,原数不变;自反律 A^B^B=A^0=A
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> np;
int i = 0;
for(int n : nums){
i ^=n;
}
return i;
}
};
class Solution:
def singleNumber(self, nums: List[int]) -> int:
a = 0
for i in nums:
a = a ^ i;
return a
也阔以考虑使用hashmap把重复数过滤,进行筛选;