一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用(异或运算)

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用

面试的题目

贴一下代码:

 1 //位运算应用
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 const int maxn=1e5+10;
 6
 7 int n;
 8 int a[maxn];
 9
10 void found(){
11     int xors=0;
12     for(int i=0;i<n;i++){
13         xors^= a[i];
14     }
15     for(int i=0;i<n;i++){
16         xors^=i;
17     }
18     printf("xors= %d\n",xors);
19 }
20
21 int main()
22 {
23     scanf("%d",&n);
24     for(int i=0;i<=n;i++)
25         cin>>a[i];
26     found();
27     return 0;
28 }
29 /*
30 5
31 1 2 3 4 5 5
32 5
33 */

原文地址:https://www.cnblogs.com/ZERO-/p/10457416.html

时间: 2024-10-09 22:25:54

一个序列,除了一个数出现两次,其他数都出现一次,找出来重复的这个数-位运算应用(异或运算)的相关文章

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算

问题:一般我们要交换两个变量的值,多会采取一个额外变量来实现,比如temp=a,a=b,b=temp,现在我们能不利用temp来实现交换a,b两个变量值的目的吗? 解决方案:^异或运算符,而且我们会发现a^a=0,还有0^a=a,依据这两条理论,我们可以实现之前提出的问题. 代码如下: #include<stdio.h>void inplace_swap(int * x,int * y){    *y=*x^*y;    *x=*x^*y;    *y=*y^*x;}int main(){  

求一个序列中的主元素

问题(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. 解答:

Swift处理堆栈问题——给定两组序列,其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的.比如输入的push 序列是1.2.3.4.5,那么4.5.3.2.1 就有可能是一个pop 系列,但序列4.3.5.1.2 就不可能是push 序列1.2.3.4.5 的pop 序列. 分析: 我们首先定义遍历push的序数i=0  遍历pop序列的序数 j =0 我们可以先遍历给出的push序列,并且时刻与pop序列的头元素p

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

当然了,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<std

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。 牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。 这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等.问是否可行.牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍.这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次.输入描述: 输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9. 输出描述: 假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO" 输入例子: 2 1 2 输出例子: YES

算法试题 - 找出一个序列中出现频率最高的三个数

题目 找出一个序列中出现频率最高的三个数 解析 思路一 创建一个新字典, k 为 序列的值, 然后 v 的初始值 0, 然后循环序列进行计数, 然后进行新字典的处理..... 不行, 不好处理了. 此思路不行 思路二 利用 colletctions 的 Counter 模块, 内部有个方法可以解决 k 值问题 答案 答案一 可以往下继续实现, 但是有点麻烦了 li = [2, 5, 3, 4, 1, 8, 1, 2, 6, 6, 1, 5, 1, 5] d = dict.fromkeys(li,

和为s的两个数,一串连续数 41

? ? 引言 ? ? 第一问题很简单,leetcode上也有相应的题,2Sum问题,leetcode上还有2Sum的进阶版3Sum,只是在这个问题上增加了一层循环而已,另外还有3Sum_Close问题,就是和接近s的三个数,本文将依次介绍2Sum问题,3Sum问题,以及3Sum_close,以及一串连续数问题 ? ? 对于3Sum的问题,本文除了常用的退化为2Sum的n平方的解法外,还提供了一种hash的方法,使得利用hash的方法使得4Sum问题不再是n三次方的时间复杂度,可以降到n平方的时间

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

前言 今天遇到求逆序对的问题,经过一番思索之后,特意来总结一下.因为也学习到了很多方法,以前自己一些百思不得其解的问题也有了解答. 正文 先上一个简单的问题: 分析:题目中说使用插入排序,也就是在排序过程中计算交换的次数,按照插入排序的原理,先定第一个,再定前两个的顺序,以此类推,只要交换了,我的次数就加一,但实际上,我们一直按照原始序列的顺序一直在往后走,所以(好,重点来了)我们要插入的就是前面比我大的数字前面的位置,也就是说,我需要交换的次数就是前面比我大的数字的个数,那么我考虑那就没必要进