在一个数组中除两个数字只出现1次外,其它数字都出现了2次

前面总结了leecode上,改为成3出现,只有1个出现1次,的是通过记录每个位的个数来实现的如果count%3=1则为1,否则为0,实现起来充分利用了位运算。

编程之美上的,没有写过,今天写一下。

http://blog.csdn.net/morewindows/article/details/8214003这个博客是MVP的博客,我自己也写一遍,其实核心就是

两个数的异或为1,只有1,0疑惑才为1,所以分离这两个数到不同的区间。对如何寻找1的位置做了优化(x&-x)

#include<iostream>
using namespace std;
int main()
{

	int a[]={3,4,3,4,5,5,7,7,8,9};
	int len=sizeof(a)/sizeof(int);
	int ans0=0; //所有数的亦或
	int ans1=0;
	int ans2=0;
	for(int i=0;i<len;i++)
	{
		ans0^=a[i];

	}
	cout<<ans0<<endl;
	ans0=ans0&(-ans0); //求的ans0最低位1的位置的权重 搜索x&-x的作用
	cout<<ans0<<endl;
	for(i=0;i<len;i++)
	{
		if(ans0&a[i])
		{
			ans1^=a[i];
		}
		else
		{
			ans2^=a[i];
		}

	}
	cout<<"the first "<<ans1<<endl;
	cout<<"the seconde "<<ans2<<endl;
	system("pause");

}

在一个数组中除两个数字只出现1次外,其它数字都出现了2次,布布扣,bubuko.com

时间: 2024-12-23 18:45:13

在一个数组中除两个数字只出现1次外,其它数字都出现了2次的相关文章

4-7 在一个数组中实现两个堆栈

本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中Tag是堆栈编号,取1或2:MaxSize堆栈数组的规模:Stack结构定义如下: typedef int Position; struct SNode { ElementType *Data; Positio

每日一题16:在一个数组中实现两个栈

在一个数组中实现两个栈,当数组未填满是任一个栈不能溢出.解法是将一个栈从头开始往后插入,而另一个从后往前插入,如果插入一个元素后,两个栈的top指针未相遇,则表示数组未满,栈没有溢出. #include "stdafx.h" #include <iostream> using namespace std; struct special_stack { int capcity; int ltop,rtop; int* vals; }; special_stack* creat

6-7 在一个数组中实现两个堆栈

6-7 在一个数组中实现两个堆栈(20 分) 本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中Tag是堆栈编号,取1或2:MaxSize堆栈数组的规模:Stack结构定义如下: typedef int Position; struct SNode { Ele

面试题:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字

由于有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次.用搜索来做就没必要了,利用异或运算的两个特性—— 1.自己与自己异或结果为0 2.异或满足交换律. 因此我们将这些数字全异或一遍,结果就一定是那个仅出现一个的那个数. 示例代码如下: int[] arra = {11,12,3,12,11,12,12 }; static void Main(string[] args) { int[] arra = {11,12,3,12,11,12,12 }; int lostNum =

在一个数组中查找两个重复出现的数字

题目如下:现有一个数组长度为n+1,里面存放有1到n-2,顺序不定,其中有两个数字出现了两次,现在要找出那两个数字. 例子A={2, 3, 1, 4, 5, 2, 4}, 这个数组长度为7,存放了1到5,但2和4出现了两次,程序输出2和4 方法1 蛮力查找 主要思想:对于数组中的第i个数,查找i+1到末尾的所有整数,一个数如果出现了两次就可以在第一次后面找到第二次出现的数. 时间复杂度 O(n^2) #include<stdio.h> void find_duplicates(int* num

6-7 在一个数组中实现两个堆栈 (20 分)

题目地址:https://pintia.cn/problem-sets/15/problems/730 Pop函数成功弹出后应该返回弹出的值,否则就是错的,应该是和PrintStack函数有关 Stack CreateStack(int Maxsize) { Stack S = (Stack)malloc(sizeof(struct SNode)); S->Data = (int *)malloc(sizeof(ElementType)* Maxsize); S->MaxSize = Maxs

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

C语言:一个数组中只有两个数字是出现一次

1 //1.一个数组中只有两个数字是出现一次, 2 //其他所有数字都出现了两次. 3 //找出这两个数字,编程实现.a 4 5 //^=单独两个数的^结果 6 //单独出现的两个数不同位的标记 7 //position: ^结果中第一个出现1的位置 8 //position位两个数肯定有一个为0 ,一个为1 9 //把数组分成两部分 10 //1:position为1 11 //2:position为0 12 //每一部分都有一个只出现一次的数字,其他的都是成对出现 13 //每一部分^结果为

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.如果有多对数字的和等于输入的数字,输出任意一对即可.例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void findTwo(int *array, int len, int sum) 5 { 6 int beg = 0; 7 int end = len-1; 8 int