1. 程式人生 > >在一個數組中查詢兩個重複出現兩次的數

在一個數組中查詢兩個重複出現兩次的數

題目如下:現有一個數組長度為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) 

空間複雜度 O(1)

方法2:異或(xor)

主要思想:由於限定了是1到n之間的數,且每個數至少出現一次,可以先把陣列中的所有整數異或一遍,然後把結果再和1、2、3、、、n異或一遍,這樣就得到了那兩個重複出現的整數的異或結果 x。接下來主要是想辦法把它們兩給區分開來,對於異或結果x,它的二進位制表示有0和1構成,由異或的性質可知,二進位制表示的x中那些出現0的位是兩個重複數對應位置均為1或者0的結果,而出現1的位則只有一種可能:兩個數對應位置一個是0,一個是1。藉助這個特點,我們就可以選取一個特定的位置(x的那個位置是1)把原來的陣列分成兩個部分,部分I對應那個特定位置為1的數,部分II對應那個特定位置為0的數,這樣就把問題轉化為:在每個部分查詢一個重複出現的數字。

時間複雜度 O(n) 
空間複雜度 O(1) 


#include<stdio.h>

//method 1
//void find_duplicates(int *num, int start, int end) 
//{
//	int size = end - start + 1;
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < size; i++) 
//	{
//		for (j = i + 1; j < size; j++) 
//		{
//			if (num[i] == num[j])
//				printf("%d\n", num[i]);
//		}
//	}
//
//}

//method 2
void find_duplicates(int *num, int start, int end) 
{
	int size = end - start + 1;
	int bit_flag = 0;
	int i = 0;
	for (i = 0; i < size; i++) 
	{
		bit_flag ^= num[i];
	}

	for (i = 1; i < size - 1; i++) {
		bit_flag ^= i;
	}
	//根據bit_flag二進位制中最右邊的1將陣列中的整數劃分成兩個部分
	int division_bit = bit_flag & ~(bit_flag - 1);

	int a = 0;//部分I的xor結果
	int b = 0;//部分II的xor結果
	for (i = 0; i < size; i++) {
		if (num[i] & division_bit)
			a ^= num[i];
		else
			b ^= num[i];
	}
	for (i = 1; i < size - 1; i++) {
		if (i & division_bit)
			a ^= i;
		else
			b ^= i;
	}
	printf("duplicate numbers a=%d \t b=%d\n", a, b);
}

void main() 
{
	int A[] = {2, 3, 1, 4, 5, 2, 4};
	find_duplicates(A, 0, 6);
}



相關推薦

個數找出眾數,及其出現次數

$arr = [1, 4, 3, 3, 3, 4, 4, 4]; $maxCount = []; $len = count($arr); $zhongshu = ''; for($i=0; $i<

個數查詢重複出現次的數

題目如下:現有一個數組長度為n+1,裡面存放有1到n-2,順序不定,其中有兩個數字出現了兩次,現在要找出那兩個數字。 例子A={2, 3, 1, 4, 5, 2, 4},這個陣列長度為7,存放了1到5,但2和4出現了兩次,程式輸出2和4。方法1 蠻力查詢主要思想:對於陣列中的

找到個數相加為特定數值的元素

作者:lty 時間:2017/7/8 14:39:44 題目:給定一個整數陣列,返回兩個數字的索引,使它們相加到一個特定的目標。您可以假設每個輸入都只有一個解決方案,而您可能不會使用相同的元素兩次。 eg: Given nums = [2, 7,

3Sum(在個數找到三數字的和為0不重複)leetcode15

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find a

個數查詢任意個數和為m的的組合

最近比較鬱悶,遇到幾次類似的題目了,現在打算總結一下,防止以後又忘了 1、輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的

php從個數刪除多元素,獲取陣列鍵值對等……

$array1 = array(1,2,3,4,5,6); $array2 = array(2,3); //1、獲取陣列鍵值對 $arr1 = array_keys($array2); var_dump($arr1); Array ( [0] => 0 [1] =&g

個數右邊第一比他大的數(單調棧)

題意思路如標題 int main() { int n; cin >> n; int a[MAXN]; for (int i = 0; i < n; ++i) { cin >> a[i];

位運算解決“個數,只有一個數字出現n次,其他數字出現k次”問題

不重復 blog ron 運用 ons 利用 缺失 tail 位運算符 轉自:https://blog.csdn.net/monster_girl/article/details/52928864 在學習完位操作後,經常會遇到一類關於查找缺失整數的問題。 第一類是給你一個

快速找出個數數字,讓這數字之和等於一個給定的值

http 知識 繼續 進一步 repl 有一個 tails 窮舉 too 我覺得寫得很清晰,希望沒有侵犯作者的著作權,原文地址http://blog.csdn.net/hackbuteer1/article/details/6699642 快速找出一個數組中的兩個數字,讓這

個數個數的和為N,找出這數字的下標

完整 進行 代碼 ray 由於 比較 返回 put else 分析,兩個數字的和為N。那麽這兩個數字是否是唯一的呢?輸出的下標是否是第一對出現的呢? 1,我們假設這兩個數字是唯一的 和是唯一的,那麽其中一個數字越大,另一個數字就越小。想到大小關系,我們就想到了排序。那麽首先

C語言:個數只有數字是出現

1 //1.一個數組中只有兩個數字是出現一次, 2 //其他所有數字都出現了兩次。 3 //找出這兩個數字,程式設計實現。a 4 5 //^=單獨兩個數的^結果 6 //單獨出現的兩個數不同位的標記 7 //position: ^結果中第一個出現1的位置 8 //position位

個數只有數字是出現次, 其他所有數字都出現次,找出這數字

題目:一個數組中只有兩個數字是出現一次, 其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 參考程式碼: #include<stdio.h> #include <windows.h> void find_num(int arr[], int len

個數只有數字是出現次,其他所有數字都出現次。 找出這數字,程式設計實現。

1.一個數組中只有兩個數字是出現一次,其他所有數字都出現了兩次。 找出這兩個數字,程式設計實現。 #include<stdio.h> #include<stdio.h> int main() { int arr[] = { 1, 3, 8, 1,

個數只有數字是出現次別的所有數字都出現次找出這數字

int main() { int arr[] = { 1, 3, 8, 1, 3, 8, 4, 6 }; int sz = sizeof(arr) / sizeof(arr[0]); int num = 0; int pos = 0; int i =

個數實現堆疊

函式介面定義: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其

PTA 資料結構與演算法題目集(中文)6-7 在個數實現堆疊

6-7 在一個數組中實現兩個堆疊(20 分)本題要求在一個數組中實現兩個堆疊。函式介面定義:Stack CreateStack( int MaxSize ); bool Push( Stack S, E

個數,除了有數字只出現次外,其他數字都出現次,求出這出現次的數字

求出兩個只出現一次的數字 首先,我們知道兩個相同的數字進行異或操作時為0,如果題目裡面只有一個數字出現一次的話,我們就可以直接對陣列中的所有數字進行異或操作,最後得到的數字就是單獨出現的那個數字,但

php 找出個數數字,讓這數字之和等於一個給定的值

有關於php的有好幾種思路,很多部落格都有我就不一一介紹了,只是貼程式碼僅供參考。 問題:給一個一維陣列,不確定具體有多少元素,例如$arr = [1,2,3,4,3,2,1],讓他們任意兩數字相加的和等於一個給定的值,比如說 5 ,可能有好幾個兩個數相加都是5,但只是取最

程式設計師面試題:快速找出個數數字,讓這數字之和等於一個給定的值

能否快速找出一個數組中的兩個數字,讓這兩個數字之和等於一個給定的值,為了簡化起見,我們假設這個陣列中肯定存在至少一組符合要求的解。 假如有如下的兩個陣列,如圖所示: 5,6,1,4,7,9,8 給定Sum= 10 1,5,6,7,8,9 給定Sum=

【C語言】個數只有數字是出現次,其他所有數字都出現次。 找出這數字,程式設計實現。

一看到這道題,我想到了之前學習過的異或。我們知道兩個相同的數字異或的結果是 0,因為在計算機中,異或運算是按照二進位制位來運算的,相同為 0 ,相異為  1。任何數與 0 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,