题目链接: 只出现一次的数字
有关题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。
找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
题解
1、暴力求解
int singleNumber(int* nums, int numsSize){
int Result = 0;
for(int i = 0; i < numsSize; i++)
{
int count = 0;
for (int j = 0; j < numsSize; j++)
{
if (nums[j] == nums[i])
count++;
}
if (count == 1)
{
Result = nums[i];
break;
}
}
return Result;
}
2、排序
代码一:
int cmp_int (const void* e1, const void* e2)
{
return *(int*)e1-*(int*)e2;
}
int singleNumber(int* nums, int numsSize){
qsort (nums,numsSize,sizeof(int),cmp_int);
int i;
for( i = 0; i < numsSize - 1; i += 2)
{
if(nums[i] != nums[i + 1])
return nums[i];
}
return nums[i];//这边是11224,这种最后一个数字位目标值
}
代码二:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
int ans = 0;
for (int i = 0; i < n; i += 2){
if (i == n - 1 || nums[i] != nums[i + 1]){
ans = nums[i];
break;
}
}
return ans;
}
};
3、哈希表
代码一:
typedef struct
{
int key;
}HashTable;
int FindNums(HashTable* Hash,int flag, int target)
{
int count = 0;
for(int i = 0; i < flag; i++)
{
if(Hash[i].key == target)
count++;
}
return count;
}
void InsertNums(HashTable* Hash,int index,int value)
{
Hash[index].key = value;
}
int singleNumber(int* nums, int numsSize){
int Result = 0;
HashTable Hash[numsSize];
for(int i = 0; i < numsSize; i++)
{
InsertNums(Hash,i,nums[i]);
}
for (int i = 0; i < numsSize; i++)
{
if (FindNums(Hash,numsSize,nums[i]) == 1)
Result = nums[i];
}
return Result;
}
代码二:
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> freq;
for (auto num : nums){
++freq[num];
}
int ans = 0;
for (auto [num, occ] : freq){
if (occ == 1){
ans = num;
break;
}
}
return ans;
}
};
4、利用异或的性质(异或的性质)
int singleNumber(int* nums, int numsSize){
int Result = 0;
for (int i = 0; i < numsSize; i++)
{
Result ^= nums[i];
}
return Result;
}
哈希表和异或的算法都是满足时间复杂度位线性的