题目1351:数组中只出现一次的数字
结果超时未能AC
结果AC
-
题目描述:
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
-
输入:
-
每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2<=n <= 10^6。第二行包含n个整数,表示数组元素,元素均为int。
-
输出:
- 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
-
样例输入:
-
8 2 4 3 6 3 2 5 5
-
样例输出:
-
4 6
数组解题
#include <stdio.h>
#include <stdlib.h>
int a[1000000];
int b[2];
int compare(const void *p,const void *q)
{
return *(int *)p - *(int *)q;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
j=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),compare);
for(i=0;i<n-1;)
{
if(a[i]==a[i+1])
i+=2;
else{
b[j++]=a[i];
i++;
if(j==2)
break;
}
}
if(j==1)
b[1]=a[n-1];
printf("%d %d\n",b[0],b[1]);
}
return 0;
}
结果超时未能AC
用vector解题
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,i;
while(scanf("%d", &n) != EOF){
vector<int> data;
data.resize(n);//保证[0,n]范围内数据有效,以外的数据无效
for(i = 0; i < n; ++i){
scanf("%d", &data[i]);
}
sort(data.begin(), data.end());
vector<int> result;
for(i = 0; i < data.size() - 1;){
if(data[i] == data[i + 1]){
i += 2;
}
else{
result.push_back(data[i]);
++i;
if(result.size() == 2){
break;
}
}
}
if(result.size() == 1){
result.push_back(data.back());//把末尾元素加进去
}
printf("%d %d\n", result[0], result[1]);
}
return 0;
}
结果AC
vector和数组的区别如下: