一个组数中只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数

原题:给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。

编写函数实现。

对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,经过分析发现异或全部数组的数所得到的数为整个数组中两个只出现一次数异或的结果先对所有的元素进行异或。可以通过将结果转换为二进制,在移位二进制数中的第一个1,然后根据这个1的判断条件将整个数组分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数。

例如:数组中的元素为下面这些数:

0000      --0

0000      --0

0001      --1

0001      --1

0010      --2

0011      --3

0011      --3

0100      --4

0100      --4

0101      --5

全部元素异或的结果为:0111    以最后面的1为条件,分为第一组(1、1、3、3、5)和第二组(0、0、2、4、4),分别对两组元素进行全部异或。

代码如下:

#include<stdio.h>
#include<stdlib.h>

int find_one(int num)//返回二进制数find中第一个出现1的位数,即位移量
{
	int tmp = 0;
	while (num)
	{
		if (num & 1 == 1)//进行与运算,找出现1的位数
		{
			return tmp;
		}
		else
		{
			tmp++;
			num = num >> 1;
		}
	}
	return -1;
}

int find(int str[],int size,int *p1,int *p2)
{
	int find = 0;
	int i,pos;
	for (i = 0; i < size; i++)
	{//异或整个数组的数所得到的数find,即为数组中两个只出现一次数异或的结果
		find ^= str[i];
	}
	pos=find_one(find);
	for (i = 0; i < size; i++)
	{//将整个数组分成两部分,找出两个数
		if (1 & (str[i] >> pos))
		{
			*p1 ^= str[i];
		}
		else
		{
			*p2 ^= str[i];
		}
	}
}

int main()
{
	int arr[] = { 1, 2, 3, 5, 7, 2, 5, 1 };
	int len;
	int num1 = 0;
	int num2 = 0;
	len = sizeof(arr) / sizeof(arr[0]);
	find(arr, len,&num1,&num2);//注意此处num1和num2应传递地址
	printf("%d %d\n", num1, num2);
	system("pause");
	return 0;
}
时间: 2024-08-13 19:55:29

一个组数中只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数的相关文章

【C语言】给一组组数,只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数。

//给?组组数,只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数. #include <stdio.h> int find_one_pos(int num) //找一个为为1的位置 { int n = 0; while(num) { if (num & 1 == 1) break; else { n++; num >>= 1; } } return n; } void find_two_differ(int arr[], int len, int *num1,

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 示例 1: nums1 = [1, 3] nums2

找出一组数中只出现一次的两个数,其他所有数都是成对出现的

题目: 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数.编写函数实现. 题目分析: 上次介绍了,对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,但是对于找出两个出现一次的数应该怎么解决呢?先对所有的元素进行异或,则结果为两个出现一次的数的异或结果,然后将结果转换为二进制,找出二进制数中的第一个1,然后根据这个1的判断条件进行分组,分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数. 例如:数组中的元素为下面这

一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数

先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数.对于这个题,我们只需对所有数及逆行异或即可.理论公式: a⊕b=b⊕a a⊕0=a a⊕b⊕b=a a⊕(b⊕c)=(a⊕b)⊕c 代码: #include <stdio.h> #include <stdlib.h> int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; int ret = 0; int len = sizeof(arr) /

一个数组中,一些数出现2次,只有两个数各出现一次,找出这两个数

https://leetcode.com/problems/single-number-iii/ 初次看到这题时,就想到用异或,但只能找出这两个数异或的结果,不能找出这两个数.最后我用快排过了,然后去看了看人家的思路.看来还是得仔细分析其中的隐藏信息啊.比如:从这两个数异或后的结果值可以看出,从低位开始到某一位不为0时,一定是这两个数的二进制位在此时不同了(从低位开始一定可以找到一个不为0的,因为这两个数不同).这个位可以用树状数组的lowbit方法将异或值与此值的负数进行异或求出.然后将这个数

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

曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

一组数组中只有一个数(两个数)出现一次,其他的都成对出现,找出该数

一组数据中只有一个数字出现了一次.其他所有数字都是成对出现的.请找出这个数字.(使用位运算) >可以这么理解:如果两个数相等,它们异或之后的结果是0.而0与任何数异或都是该数本身. (比如00000001^00000001结果是0.00000000^00000001=00000001) 那么将一组数中所有元素异或,相同的数字结果是0,最后的结果就是单独出现的数字. 编程实现如下: #include <stdio.h> #include <windows.h> int main

【c语言】 给一组数,有两个数只出现了一次,其他所有数都是成对出现的。找出这两个数

// 给一组数,有两个数只出现了一次,其他所有数都是成对出现的.找出这两个数. #include <stdio.h> void find_two_diff(int arr[], int len, int *num1, int *num2)//设置两个返回型参数 { int i = 0; int ret = 0; int pos = 1; *num1 = 0; *num2 = 0; for (i = 0; i < len; ++i) { ret ^= arr[i]; } // 找出ret中

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

package test; import java.util.*; public class test17 { public static void main(String[] args) { //一个整型数组里除了两个数字之外,其他的数字都出现了两次. // 请写程序找出这两个只出现一次的数字. int[] ints = {1,1,2,5,5,6,3,3}; Map<Integer, Integer> map = new HashMap<Integer, Integer>();