题目描述
给定一个非空整数数组,除了某个元素出现一次之外,其余每个元素均出现两次。找出那个只出现了一次的元素。
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
Solution 1:
自己瞎写的一个解法,用两个下标 i , j i,j i,j 同时对 v[ ] 进行遍历, i i i 从0开始, j j j 从 i i i+1 开始,一旦 v[ i i i ]=v[ j j j ],则删除第 j j j 个元素,break, i i i++,再进行遍历,v[ i i i ]遇到只出现一次的元素时,对于这个 i i i 则不会有v[ i i i ]=v[ j j j ],由此可得只出现了一次的元素的索引。
#include <iostream>
#include <cstdio> // getchar()
#include <vector>
using namespace std;
int main(void)
{
vector<int> v;
int a;
int flag = 0;
size_t index = 0; // vector数组索引类型,实测用 int 也行,
//但因机器不同用 size_t 可移植性更强
while (1)
{
cin >> a;
v.push_back(a);
if (getchar() == '\n')
break;
}
for (vector<int>::size_type i = 0; i != v.size(); i++) // typedef std::size_t std::vector<int>::size_type
{ // 用下标方式进行遍历
flag = 0;
for (size_t j = i + 1; j != v.size(); j++)
{
if (v[i] == v[j])
{
flag = 1;
v.erase(v.begin() + j); // 删除数组 v 中第 j+1 个元素
break;
}
}
if (flag == 0)
{
index = i;
break;
}
}
cout << v[index] << endl;
return 0;
}
Solution 2:
这个就是高级解法了,将所有元素做异或运算(
⊕
\oplus
⊕),即
v[1]
⊕
\oplus
⊕ v[2]
⊕
\oplus
⊕ v[3]
⊕
\oplus
⊕…
⊕
\oplus
⊕ v[n],所得的结果就是那个只出现一次的数字,时间复杂度为
O
(
n
)
O(n)
O(n)。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
size_t getIndex(vector<int> a, int b);
int main(void)
{
vector<int> v;
int input;
int res;
size_t index = 0;
while (1) // 数据输入
{
cin >> input;
v.push_back(input);
if (getchar() == '\n')
break;
}
for (vector<int>::iterator i = v.begin() + 1; i != v.end(); i++) // 用迭代器进行遍历
res = res ^ *i; // 异或,0^a=a
index = getIndex(v, res);
cout << v[index] << endl;
return 0;
}
size_t getIndex(vector<int> a, int b)
{
for (vector<int>::size_type i = 0; i != a.size(); i++) // 用下标进行遍历
if (b == a[i])
return i;
}