///*
假設你有乙個用1001個整數組成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。
此外,除乙個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。
如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演算法嗎?
1001個數異或結果與1-1000異或的結果再做異或,得出的值即位所求。
原理:設重複數為a,其餘999個數異或結果為b。
1001個數異或結果為a^a^b
1-1000異或結果為a^b
由於異或滿足交換律和結合律,且x^x = 0 0^x = x;
則有(a^b)^(a^a^b)=a^b^b=a
*/#include "stdafx.h"
/* n為陣列元素個數減一,即為陣列中最大的數,即數的範圍為1-n
陣列長度為n+1
*/void xor_finddup(int * a,int n)
{ int i;
int result=0;
for(i=0;i
面試題 數字在排序陣列中出現的次數
本體的思路 二分查詢 因為陣列有序 查詢數字 在陣列 中出現的次數 特殊 陣列為空 數字不出現在陣列中 數字出現在頭 尾 數字剛好為中間值 數字不為中間值 先對 返回 再判斷對 如果是首,則令last first,迴圈判斷list last 是否依舊等於a,相等則計數加 不等時,若last是第乙個不...
面試題29 陣列中出現次數超過一半的數字
題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5詞,超過陣列長度的一半,因此輸出2.思路 1,如果對陣列排序,那麼n 2對應的數一定是超過一半的數字 前提是存在這個數字 即長度為n的陣列中第n 2大的數字,o n 2,根據陣列...
面試題25 陣列中出現次數超過一半的數字
方法一 先對陣列進行排序 再遍歷排序後的陣列,統計每個數 的次數 出現次數最大的數即為要找的數。時間複雜度 o nlogn o n o nlogn 不需要額外儲存空間 方法二 先對陣列進行排序 出現次數超過陣列長度的一半的數必然是 陣列中間的那個數 時間複雜度o nlgn o 1 o nlgn 不需...