求一个序列中两个只出现一次的数

当然了,O(1)空间复杂度是必须的...

先看一个简单版:

求出一个序列中一个只出现一次的数

COJ 1217 奇数个的那个数

http://122.207.68.93/OnlineJudge/problem.php?id=1217

我们知道任意两个相同的数 异或结果为0  任何数与0异或结果是其本身  异或运算满足交换律

亦即:a^a=0     a^0=a      (a^b)^(a^b)=(a^a)^(b^b)=0^0=0

这样我们就得到了一个用异或运算的解法

 1 #include<stdio.h>
 2 int main()
 3 {
 4   int n,a,res;
 5   while(scanf("%d",&n)!=EOF)
 6   {
 7     res=0;
 8     while(n--)
 9     {
10       scanf("%d",&a);
11       res^=a;
12     }
13     printf("%d\n",res);
14   }
15   return 0;
16 }

现在考虑加强版:找出一个序列中两个只出现了一次的数

COJ 1240 低调,低调

http://122.207.68.93/OnlineJudge/problem.php?id=1240

我们可以利用上面的思路,假设这两个数是a和b 则按照上面的方法得到的res=a^b

因为a和b是两个不同的数,所以它们的二进制表示中,至少有一位是不同的,也就是说res的二进制表示中至少有一位是1

我们可以根据这一位将这两个数分开来.

具体做法就是:

1、先遍历一遍数组,得到res=a^b

2、然后通过k<<i&res 的方式找到res的那一位1

3、最后根据这一位是0和1 把整个数组分为两部分 设两个ans ans1和那一位是0的去异或 ans2反之 则最后ans1 和 ans2刚好就是a和b

具体见代码:

 1 #include<stdio.h>
 2 int main()
 3 {
 4   int n,k,a,result,judge,ans1,ans2;
 5   while(~scanf("%d%d", &n, &k))
 6   {
 7     result=0;
 8     ans1=0;
 9     ans2=0;
10     for(int i=0;i<k;i++)
11     {
12       scanf("%d", &a);
13       result^=a;
14     }
15     for(judge=1;judge<=result;judge<<=1)
16     {
17       if(judge&result)
18       {
19         break;
20       }
21     }
22     for(int i=0;i<k;i++)
23     {
24       scanf("%d", &a);
25       if(judge&a)
26       {
27         ans1^=a;
28       }else
29       {
30         ans2^=a;
31       }
32     }
33     if(ans1>ans2)
34     {
35       printf("%d %d\n", ans2, ans1);
36     }else
37     {
38       printf("%d %d\n", ans1, ans2);
39     }
40   }
41   return 0;
42 }

求一个序列中两个只出现一次的数

时间: 2024-08-10 21:28:19

求一个序列中两个只出现一次的数的相关文章

求一个序列中的主元素

问题(2013 统考408真题):已知一个整数序列A = (a0,a1,...,an-1), 其中0≤ai≤n (0≤i<n).若存在ap1=ap2...=apm=x且m>n/2 (0≤pk≤n,1≤k≤m),则称x为A的主元素.例如,A=(0,5,5,3,5,7,5,5),则5为主元素,又如A=(0, 5, 5,3, 5, 1, 5,7),则A中没有主元素.假设A中的n个元素保存在一个一维数组中, 请设计一个尽可能高效的算法,找出A的主元素.若存在主元素,则输出该元素:否则输出-1. 解答:

面试题---找出数组中两个只出现一次的数

题目描述:给一个数组,里面有两个数只出现一次,其它的数都出现两次,请找出这两个数: 样例:输入 2 4 2 7 4 9 输出 7 9 思路:假定要找出的这两个数为x.y   把所有的数异或,结果是x与y异或的值,那么肯定不为0,那么这个值的二进制至少有一位为1,也就是说x和y的二进制在这一位上必定一个为0,一个为1,那么可以根据这一位把这个数组分成两个数组,x和y在不同的数组里,接下来对每个数组直接异或出的值就是结果了: 代码如下: #include <iostream> #include &

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).

算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)

题: 给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列.例: S = [1, 2, 3, 2, 4] T = [1, 2, 4] 则S的所有包含T的子序列为: [1, 2, 3, 2, 4] [1, 2, 3, 4] [1, 2, 2, 4] [1, 2, 4] 解: 首先可以拆解为两个问题: 1. 求S的所有子序列:其中又涉及到去重的问题. 2. 求S的所有子序列中包含T的子序列. 暂时先不考虑去重,看看问题1怎么解: 一.求S的子序列 单纯求一个序列的所有子序列的话,就是求序列的

求一个数组中只出现一次的数字

/* 求一个数组中只出现一次的数字(注:只针对数组中有两个数不同,且其他数字两两相同) 题目:一个整型数组里除了两个数字出现一次外,其他的数字都出现了两次:求出现一次的数字: 如:数组a[]={2,4,3,6,3,2,5,5};执行程序后应输出4和6:因为4,6只在该数组中出现了一次 思路:两个数字相同其异或结果一定为0,先异或->再分组-->再对每个子序列异或 算法: 1. 先对数组的每一个元素进行异或操作,求结果(本质就是对那两个不同的数的异或,即4^6=0010) 2.根据异或的操作结果

求一个字符串中连续出现最多的子串次数

时间:2014.09.12 地点:基地 心情:明天就要和欧阳去武汉面试阿里了,整理一下同学求助的一道题,写下这一篇,愿一切顺利. 一.题目: 求一个字符串中连续出现最多的子串次数:例如字符串abcbcbcabc,连续出现次数最多的子串是bc,出现次数为3. 二.分析 方法:后缀思路 比如题目中举例中的字符串,它的后缀有: abcbcbcabc  0 bcbcbcabc  1 cbcbcabc  2 bcbcabc  3 cbcabc  4 bcabc  5 cabc  6 abc  7 bc  

求一个数组中最大连续子序列的和

10.求一个数组中最大连续子序列的和 参考链接:http://blog.csdn.net/butwang/article/details/4691974 思路:如果已经知道在前0~k-1共k个元素中,在最大和为MaxAll[k-1], 怎么求0~k共k+1个元素的MaxAll[k]. 如果前k个元素的最大和子序列包括a[k-1],则很容易知道MaxAll[k] = max(MaxAll[k-1] + a[k], a[k]).那如果前k个元素的最大和子序列不包括a[k-1]呢?在数组后面增加一个元

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3