编程算法 - 数字数组中只出现一次 代码(C)

数字数组中只出现一次 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 一个整型数组里除了两个数字以外, 其它的数字都出现了两次. 请敲代码找出这两个仅仅出现一次的数字.

假设从头到尾依次异或数组中的每个数字, 那么终于的结果刚好是那个仅仅出现一次的数字.

依据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再又一次进行异或. 最后得出两个结果.

时间复杂度O(n).

代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

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

size_t FindFirstBitIs1(int num) {
	size_t indexBit = 0;
	while ((num&1)==0 && indexBit<(8*sizeof(int))) {
		num >>= 1;
		++indexBit;
	}
	return indexBit;
}

bool IsBit1(int num, size_t indexBit) {
	num >>= indexBit;
	return (num&1);
}

void FindNumsApprearOnce(int data[], int length, int* num1, int* num2) {
	if (data == NULL || length <= 0)
		return;
	int resultExclusizeOR = 0;
	for (int i=0; i<length; ++i)
		resultExclusizeOR ^= data[i];
	size_t indexOf1 = FindFirstBitIs1(resultExclusizeOR);
	*num1 = *num2 = 0;
	for (int j=0; j<length; ++j) {
		if (IsBit1(data[j], indexOf1))
			*num1 ^= data[j];
		else
			*num2 ^= data[j];
	}
}

int main(void)
{
	int data[] = {2, 4, 3, 6, 3, 2, 5, 5};
	int num1, num2;
	FindNumsApprearOnce(data, 8, &num1, &num2);
	printf("num1 = %d num2 = %d\n", num1, num2);
}

输出:

num1 = 6 num2 = 4

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-28 11:29:46

编程算法 - 数字数组中只出现一次 代码(C)的相关文章

算法:数组中只出现了一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都是出现了两次.请写出程序找出这两个只出现了一次的数字.要求时间复杂度是O(n), 空间复杂度是O(1). 题解 tip1:如果该数组A中只有一个数字出现了一次,其他的数字都出现了两次,那么求出该数字就很简单,其值就是 A[0] ^ A[1] ^ - ^ A[n-1] 因此就需要想办法,将问题转换为tip1里的问题场景. tip2:将题目中的数组的每个数字都异或,求得值为x,那么实际上x就是该数组中那两个仅出现了一次的数字的异或值. 假设x的第k为

C++ 算法之 数组中只出现一次的数字

题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),控件复杂度为O(1) 算法思路: 如果一个数组当中,只要一个数字出现一次,其他都是出现两次,那么我们只要把所有的数进行异或得到的就是结果 现在有两个数字出现一次,那么我们还是异或所有的数,最后的到的结果就是这两个不想等的数字的异或结果 比如 2 4 3 6 3 2 5 5 最后异或就是 4 与 6 异或,那么它们两个异或的结果肯定不是0:也就是说这个结果数字的二进制 当中

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

编程算法 - 数字在排序数组中出现的次数 代码(C)

数字在排序数组中出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 统计一个数字在排序数组中出现的次数. 通过折半查找, 找到首次出现的位置, 再找到末次出现的位置, 相减即可. 时间复杂度O(logn). 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #inc

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

【编程题目】数组中超过出现次数超过一半的数字 ☆

74.数组中超过出现次数超过一半的数字(数组)题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. 思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比 /* 74.数组中超过出现次数超过一半的数字(数组) 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. */ //思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比 #include <stdio.h> #include <stdlib.h> int fin

求一个数组中只出现一次的数字

/* 求一个数组中只出现一次的数字(注:只针对数组中有两个数不同,且其他数字两两相同) 题目:一个整型数组里除了两个数字出现一次外,其他的数字都出现了两次:求出现一次的数字: 如:数组a[]={2,4,3,6,3,2,5,5};执行程序后应输出4和6:因为4,6只在该数组中出现了一次 思路:两个数字相同其异或结果一定为0,先异或->再分组-->再对每个子序列异或 算法: 1. 先对数组的每一个元素进行异或操作,求结果(本质就是对那两个不同的数的异或,即4^6=0010) 2.根据异或的操作结果

数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字 参与人数:1144时间限制:1秒空间限制:32768K 通过比例:21.75% 最佳记录:0 ms|0K(来自  牛客563536号) 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding

数组中只出现一次的数字-剑指Offer

数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数. 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到的结果肯定不为0,其实是那两个只出现一次的不同的数的异或,我们从低位到高危找到第一个不为0的那位,异