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

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

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

/*
	思路:
	出现两次的数进行异或为0,
	故将整个数组的数进行异或,
	则得到此只出现一次的那个数
*/

int isOdd(int num);
int getOne(int *arr, int length);

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

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;
}

  

时间: 2024-08-02 14:08:52

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

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

#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; }TwoN

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

#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

寻找数组中唯一只出现1次的数

一个数组中除开唯一一个元素只出现一次,其余的元素均出现三次. 位运算,看不明白,留着以后看吧. 1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 #define maxn 1000 5 int a[maxn],n; 6 7 int main() 8 { 9 while(scanf("%d",&n), n) 10 { 11 int one = 0, two = 0, t

找出数组中唯一的重复元素

[问题] 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次. 每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助存储空间,能否设计一个算法实现? [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> /*根据异或法的计算方式,每两个相异的数执行异或运算之后,结果为1: 每两个相同的数异或之后,结果为0,任何数与0异或,结果仍为自身. 所以数组a[N]

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //

剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。

/*在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3.*/ import java.util.*; public class Class1 { static class findRepeatedNumber{ public int findRepeatedN

算法题1 数组中唯一出现1次的数|唯一出现2次的数

题目描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字.要求时间复杂度是 O(n),空间复杂度是 O(1),例如输入数组{2, 4, 3, 3, 2, 5 },因为只有 4 这个数字只出现一次,其他数字都出现了两次,所以输出 4 思路分析:本题以及延伸题目,在剑指offer上有详细描述.利用异或的特性,x^y^x=y^x^x=y.对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字 代码 1 int FindOnceNum(int ar