题目描述:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

输入:

输入的第一行包括一个整数N(1<=N<=1000)。
接下来的一行包括N个整数。

输出:

可能有多组测试数据,对于每组数据,
找出这个数组中的两个只出现了一次的数字。
输出的数字的顺序为从小到大。

样例输入:
6
2 3 9 3 7 2
样例输出:
7 9

(题目中的条件 N 应该大于1)
开始的想法是先排序,然后再去数数,代码如下
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> int cmp(const void *a, const void *b) {
int at = *(int *)a;
int bt = *(int *)b;
return at-bt;
} int n;
int tmp[]; int main(int argc, char const *argv[])
{
while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&tmp[i]);
}
qsort(tmp,n,sizeof(int),cmp);
int i = ;
int cnt = ;
int ans1 = , ans2 = ;
while(i < n) {
if((i == n-) || tmp[i] != tmp[i+]) {
if(cnt == ) {
ans1 = tmp[i];
cnt++;
} else {
ans2 = tmp[i];
cnt++;
break;
} i++; }
else {
i += ;
}
}
printf("%d %d\n",ans1, ans2); }
return ;
}

虽然通过了,但耗时较长,几乎已达上限

之后改成用异或的方法来做

 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> int n;
int tmp[]; int main(int argc, char const *argv[])
{
int yi = ;
while(scanf("%d",&n) != EOF) {
yi = ;
for(int i = ; i < n; i++) {
scanf("%d",&tmp[i]);
yi = yi ^ tmp[i];
}
int cnt = ;
while((yi & ) == ) {
yi = yi >> ;
cnt++;
}
int ans1 = , ans2 = ;
for(int i = ; i < n; i++) {
int ct = ;
int p = (tmp[i] >> cnt)&;
if(p == ) {
ans1 = ans1 ^ tmp[i];
}
else {
ans2 = ans2 ^ tmp[i];
}
}
if(ans1 > ans2) {
int temp = ans1;
ans1 = ans2;
ans2 = temp;
}
printf("%d %d\n",ans1,ans2);
}
return ;
}

所有的异或后为那两个数异或的结果,再按该结果对原数据进行分组,将两个数分到不同的组内,再进行异或就会得出两个数。

九度oj 题目1256:找出两个只出现了一次的数字的更多相关文章

  1. 九度OJ 1256:找出两个只出现了一次的数字 (位运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...

  2. 九度oj 题目1472:求两个多项式的和

    题目描述: 输入两个多项式,计算它们的和. 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数. 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x ...

  3. 九度OJ 1035:找出直系亲属 (二叉树、递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...

  4. 九度oj 1407 快速找出最小数

    原题链接:http://ac.jobdu.com/problem.php?pid=1407 线段树,区间更新,查询区间最小值. 注意区间更新,查询的时候,区间$\begin{align*}[L,R] ...

  5. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  7. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  8. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  9. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

随机推荐

  1. debian中sudo无法使用问题

    原文链接:http://sharadchhetri.com/2013/08/07/sudo-command-not-found-debian-7/ To solve this issue instal ...

  2. C语言abs函数

    C语言编程入门教程 - abs 函数是用来求整数的绝对值的. //函数名:abs //功 能:求整数的绝对值 //用 法:int abs(int i); //程序例: #include<stdi ...

  3. VS2010中C++ 出现fatal error LNK1169: 找到一个或多个多重定义的符号

    一般是函数重定义造成的 例如定义了两个 sum(x,y)函数

  4. Codeforces Round #316 (Div. 2) D Tree Requests

    官方题解是离线询问,dfs树形转线性,然后二分找区间. 还有一种比较好的做法是直接dfs,将当前访问这个结点u相关的询问之前的状态存起来,然后访问完以后利用异或开关性,得到这颗子树上的答案. 代码是学 ...

  5. nginx “403 Forbidden” 错误 解决方法

    错误的原因是缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件 只需要配置时加一句  index  index.h ...

  6. 函数的参数是函数,函数中Ajax返回的回调函数中的函数运行

    调用函数 checkAjax('addrinfo',formdata,vzxcv); 函数checkAjax function checkAjax(url,formdata,call_back){ / ...

  7. shell脚本,tee小工具的用法。

    解释: tee是个工具 , 它的作用就是把标准输出,复制一份,扔文件里 ,原标准输出还输出,-a就相当于 >> 追加到文件里的意思.  不加就是 > 重定向到文件里去.

  8. javascript获取属性的两种方法及区别

    javascript获取属性有两种方式,点或者中括号: var obj={} obj.x=1 console.log(obj.x)//1 第一种方式,x是字面量 try{ console.log(ob ...

  9. layer的iframe层的传参和回参

    从父窗口传参给iframe,参考://https://yq.aliyun.com/ziliao/133150 从iframe回参给父窗口,参考:https://www.cnblogs.com/jiqi ...

  10. mysqlfailover测试

    mysqlfailover是mysql官方用python语言写的一款工具,包含在mysql utilities工具集中.主要作用是保障mysql高可用.他会定时检测节点状态,当master节点不可用时 ...