九度oj 题目1256:找出两个只出现了一次的数字

题目描述:

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

输入:

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

输出:

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

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

(题目中的条件 N 应该大于1)开始的想法是先排序,然后再去数数,代码如下
 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 int cmp(const void *a, const void *b) {
 7     int at = *(int *)a;
 8     int bt = *(int *)b;
 9     return at-bt;
10 }
11
12 int n;
13 int tmp[1002];
14
15 int main(int argc, char const *argv[])
16 {
17     while(scanf("%d",&n) != EOF) {
18         for(int i = 0; i < n; i++) {
19             scanf("%d",&tmp[i]);
20         }
21         qsort(tmp,n,sizeof(int),cmp);
22         int i = 0;
23         int cnt = 0;
24         int ans1 = 0, ans2 = 0;
25         while(i < n) {
26             if((i == n-1) || tmp[i] != tmp[i+1]) {
27                 if(cnt == 0) {
28                     ans1 = tmp[i];
29                     cnt++;
30                 }
31
32                 else {
33                     ans2 = tmp[i];
34                     cnt++;
35                     break;
36                 }
37
38                 i++;
39
40             }
41             else {
42                 i += 2;
43             }
44         }
45         printf("%d %d\n",ans1, ans2);
46
47     }
48     return 0;
49 }

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

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

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6
 7 int n;
 8 int tmp[1002];
 9
10 int main(int argc, char const *argv[])
11 {
12     int yi = 0;
13     while(scanf("%d",&n) != EOF) {
14         yi = 0;
15         for(int i = 0; i < n; i++) {
16             scanf("%d",&tmp[i]);
17             yi = yi ^ tmp[i];
18         }
19         int cnt = 0;
20         while((yi & 1) == 0) {
21             yi = yi >> 1;
22             cnt++;
23         }
24         int ans1 = 0, ans2 = 0;
25         for(int i = 0; i < n; i++) {
26             int ct = 0;
27             int p = (tmp[i] >> cnt)&1;
28             if(p == 0) {
29                 ans1 = ans1 ^ tmp[i];
30             }
31             else {
32                 ans2 = ans2 ^ tmp[i];
33             }
34         }
35         if(ans1 > ans2) {
36             int temp = ans1;
37             ans1 = ans2;
38             ans2 = temp;
39         }
40         printf("%d %d\n",ans1,ans2);
41     }
42     return 0;
43 }

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

时间: 2024-12-10 02:49:40

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

九度oj 1407 快速找出最小数

原题链接:http://ac.jobdu.com/problem.php?pid=1407 线段树,区间更新,查询区间最小值. 注意区间更新,查询的时候,区间$\begin{align*}[L,R] \end{align*}$$\begin{align*}L \end{align*}$都可能大于$\begin{align*}R\end{align*}$.. 有个地方写sb了害的我wa了好几次%>_<%. 1 #include<algorithm> 2 #include<ios

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

九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1. 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万). 接下来一行给出M个国家号. 输出:                        排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名 格式为: 排名:排名

九度oj 题目1546:迷宫问题 (概率dp guess消元)

题目链接:点击打开链接 题目描述: 给定一个n*m的迷宫,如 S.. ..# E.E 其中,S代表开始位置,#代表不可行走的墙,E代表出口. 主人公从开始位置出发,每次等概率的随机选择下一个可以行走的位置,直到到达某一个出口为止. 现在他想知道,在这一概率事件中,它从开始位置走到某一个出口的期望步数是多少. 输入: 输入包含多组测试用例,每组测试用例由两个整数n,m(1<=n,m<=15)开始,代表迷宫的大小 接下去n行每行m个字符描述迷宫信息,具体规则如题面所述. 数据保证至少存在一个E和一

九度oj题目1009:二叉搜索树

题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出:                        如果序列相同则输出YES,否则输出NO 样

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

九度oj 题目1337:寻找最长合法括号序列

题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的左括号匹配.例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是. 需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数. 输入: 测试数据包括多个,每个测试数据包含两行: 第一行为一个整数N,其中N不会超过10^6. 第二行为一个长度为N的字

九度oj 题目1102:最小面积子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 这道题的题意读了半天才读懂,它是要求输出满足条件的最小的矩阵面积.解决这类

九度oj 题目1025:最大报销额

题目描述:     现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元.现请你编写程序,在给出的一堆发票中找出可以报销的.不超过给定额度的最大报销额. 输入:     测试输入包含若干测试用例.每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(N<=30)是发票张数.随后是 N 行输入,每行的格式为:    m Type_1:price_

九度oj题目1341:艾薇儿的演唱会

题目1341:艾薇儿的演唱会(40分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:522 解决:237 题目描述: 艾薇儿今天来到了中国,她计划两天后在哈尔滨举行一场个人的演唱会.由于出现了紧急情况,演唱会的举办方要求艾薇儿提前举行演唱会.艾薇儿现在在北京,她需要找出一条从北京到哈尔滨耗时最短的线路,以便尽快到达哈尔滨. 中国的铁路线非常复杂,有很多条路线可以从北京到达哈尔滨.艾薇儿在网上找到了铁路线各个线路上所需花费的时间,但是她还是看不出来哪一条线路可以最快地到达哈尔滨.你有