一、题目
给定一个非空整数数组,
除了某个元素只出现一次以外,
其余每个元素均出现两次。
找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number
二、分析
异或运算法则
- 归零律: a ^ a = 0
- 恒等律: a ^ 0 = a
- 交换律: a ^ b = b ^ a
- 结合律: a ^ b ^ c = a ^ (b ^ c) = ( a ^ b) ^ c
- 自反: a ^ b ^ a = b
因此:
33 ^ 33 ^ 66^ 22 ^ 23 ^ 22 ^ 23
= 33 ^ 33 ^ 66 ^ 22 ^ 22 ^ 23 ^ 23
= 66
三、编码
1、解法一:
#include <iostream>
using namespace std;
int SingleNum(int* nums , int len) // nums是数组首地址,传给指针
{
for(int i=1;i<len;i++)
{
nums[0] ^= nums[i];
}
return nums[0];
}
int main()
{
int nums[7] = {33,33,66,22,23,22,23}; //定义一个数组
int len = sizeof(nums) / sizeof(nums[0]); //计算数组长度
cout << SingleNum(nums,len) << endl;
}
需要对数组遍历一次,
因此时间复杂度是 : O(n) , n为数组长度 ;
空间复杂度: O(1)
2、解法二:
class Solution {
public:
int singleNumber(vector<int>& nums) {
for (int i = 1; i < nums.size(); i++)
{
nums[0] ^= nums[i];
}
return nums[0];
}
};