在一個數組中查詢兩個重複出現兩次的數
例子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 異或都等於它自己。既然我們要找出來一組數中不同的兩個數字,也可以採用這種方法。 但是這次不是直接異或,