给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。
样例
给出 [1,2,2,1,3,4,3],返回 4
我的解题思路是:由于这一章是贪心算法,所以算法的时间复杂度是O(N)的,所以解决这个问题时候必须控制时间复杂度。根据我们之前学的异或运算符我们可以知道它在一排数中找到独一无二的一个数有独特的效果,只要有相同的数那么他们异或后的结果就是0,最后就剩下0和那个独一无二的数相异或,就等于那个独一无二的数了。
class Solution {
public:
/*
* @param A: An integer array
* @return: An integer
*/
int singleNumber(vector<int> &A) {
// write your code here
int x=0;
for(int i=0;i<A.size();i++)
{
x^=A[i];
}
return x;
}
};
顺便也附上暴力解决此问题的方法:
class Solution {
public:
/*
* @param A: An integer array
* @return: An integer
*/
int singleNumber(vector<int> &A) {
// write your code here
int a[10000];
int k;
for(int i=0;i<A.size();i++)
{
a[i]=A[i];
}
int count=0;
for(int i=0;i<A.size();i++)
{
for(int l=0;l<A.size();l++)
{
if(A[i]==a[l])
count++;
}
if(count==1)
{
k=A[i];
}
count=0;
}
return k;
}
};
public:
/*
* @param A: An integer array
* @return: An integer
*/
int singleNumber(vector<int> &A) {
// write your code here
int a[10000];
int k;
for(int i=0;i<A.size();i++)
{
a[i]=A[i];
}
int count=0;
for(int i=0;i<A.size();i++)
{
for(int l=0;l<A.size();l++)
{
if(A[i]==a[l])
count++;
}
if(count==1)
{
k=A[i];
}
count=0;
}
return k;
}
};