其他数出现两次的数组中两个只出现一次数

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

/*
	有102个整数,
	其中有50个数出现了两次,
	2个数出现了一次,
	找出出现了一次的那2个数。
*/

/*
	思路:
	所有数异或得到两个单独数a,b的异或值c,
	指出c为1的某位。
	根据pos位为1或者为0将数组划分为两个组,
	再分别对这两个组进行异或,
	即可得到:a,b。
*/

/*
	注:结构体要放在函数声明前
*/

typedef struct
{
	int num1;
	int num2;
}TwoNumber;

int isOdd(int num);
int getOne(int *arr, int length);
int getPos(int number);
TwoNumber getTwoNumber(int *arr, int length);

int main(){
	int length = 0;	//整数个数
	scanf("%d", &length);
	if (isOdd(length))	//判断是否是偶数
		printf("Please input an even number.\n");
	else{
		int * numbers = (int*)malloc(length * sizeof(int));	//存储这length个整数
		printf("Please input %d number: \n", length);
		int tmp;
		for (int i = 0; i < length; ++i){
			scanf("%d", &tmp);
			numbers[i] = tmp;
		}
		TwoNumber tnumber = getTwoNumber(numbers, length);
		printf("%d\n", tnumber.num1);
		printf("%d\n", tnumber.num2);
	}
	system("pause");
	return 0;
}

TwoNumber getTwoNumber(int *arr, int length){
	int number = 0;	//两个单独数的异或值
	for (int i = 0; i < length; ++i)
		number ^= arr[i];
	int pos = getPos(number);
	int num_1 = 0;	//第一组数的异或值
	int num_2 = 0;	//第二组数的异或值
	for (int i = 0; i < length; ++i){
		int tmp = arr[i] >> pos;
		if ((tmp&‘\x01‘) == 0)
			num_1 ^= arr[i];
		else
			num_2 ^= arr[i];
	}
	TwoNumber tNumber;
	tNumber.num1 = num_1;
	tNumber.num2 = num_2;
	return tNumber;
}

int isOdd(int num){
	if (num % 2 == 0)
		return 0;
	else
		return 1;
}

int getOne(int *arr, int length){
	int num = 0;
	for (int i = 0; i < length; ++i)
		num ^= arr[i];
	return num;
}

int getPos(int number){	//某个不为0的数,二进制中第一个1的位置
	int pos = 0;
	while ((number&‘\x01‘) == 0){
		pos++;
		number >>= 1;
	}
	return pos;
}

  

时间: 2024-12-15 22:27:55

其他数出现两次的数组中两个只出现一次数的相关文章

其他数出现两次的数组中三个只出现一次的数

#include <stdio.h> #include <stdlib.h> //#include <algorithm> /* 注:algorithm是C++头文件,不能用于纯C中 */ typedef struct { int num1; int num2; int num3; }ThreeNumber; int isOdd(int num); int cmp(const void *a, const void *b); ThreeNumber getThreeNu

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素

算法题:找出整数数组中两个只出现一次的数字

问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这个问题的一个简单版本:一个整数数组里除了一个数字之外,其他的数字都出现两次,请写程序找出这个只出现一次的数字. 这个问题的突破口在哪?题目中数组的性质是只有一个整数出现一次,其他的都出现两次.这样的话就使我们想到了异或运算的性质:任何一个数字异或它自己都等于0.也就是说如果从头到尾依次异或数组中的每

求数组中两两相加等于20的组合(Python实现)

题目 求数组中两两相加等于20的组合. 例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20. 解析 分为两个步骤: 先采用堆排序或快速排序对数组进行排序,时间复杂度为O(nlogn). 然后对排序的数组分别从前到后和从后到前进行遍历, 时间复杂度为O(n). 假设从前到后遍历的下标为begin,从后到前遍历的下标为end. 当arr[begin] + arr[end] < 20时,满足条件的数一定在[begin+1, en

无序数组array, 找到数组中两个数的最大差值

题目链接: 无序数组array, 找到数组中两个数的最大差值, 且大数出现在小数之后,如:arr[i]-arr[j], 且 i<j.比如: array 是 [2, 3, 10, 6, 4, 8, 1],最大差值是8(10-2) 解题思路: 记录当前访问过的数组中的最小值 min_val; 2) 当前元素值arr[i] - min_val 和 max_diff作比较 若大于 max_diff , 则更新它的值 1 import javax.validation.constraints.Min; 2

经典算法学习——快速找出数组中两个数字,相加等于某特定值

这个算法题的描述如下:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值.目前我假设数组中的都是各不相等的整数.这道题是我在一次面试中被问到的,由于各种原因,我没回答上来,十分尴尬.其实这道题十分简单,我们使用相对巧妙的方法来实现下.注意不使用两层循环的元素遍历.示例代码上传至:https://github.com/chenyufeng1991/SumTo100 . 算法描述如下: (0)首先对原数组进行排序,成为递增数组: (1)对排序后的数组头部i [0]和数组尾部j [n-1]

交换数组中两个元素的位置,元素包括key和value 一维数组

/*author: [email protected]description: 交换数组中两个元素的位置,元素包括key和value,具体用法见下面的例子*/$arr = array(11=>'a',22=>'b',33=>'c',44=>'d');$res = array_exchange($arr, 11 ,33); //example:echo '<pre>';print_r ($res);echo '</pre>'; function array_e

求数组中两两相加为某个数字的组合数

/** * 求数组中两两相加是20的组合数 * @param array * @param sum */ public static void getMethod_3(int[] array,int sum){ int count = 0; for(int i=0;i<array.length;i++){ if(i==array.length-1){ break; } for(int j=i+1;j<array.length;j++){ if(array[i]+array[j]==sum){

Coursera Algorithms week3 快速排序 练习测验: Selection in two sorted arrays(从两个有序数组中寻找第K大元素)

题目原文 Selection in two sorted arrays. Given two sorted arrays a[] and b[], of sizes n1 and n2, respectively, design an algorithm to find the kth largest key. The order  of growth of the worst case running time of your algorithm should be logn, where n