題目描述:
數字 l~1000放在含有 1001 個元素的陣列中,其中只有唯一的乙個元素值重複,其他數
字均只出現一次。設計乙個演算法,將重複元素找出來,要求每個陣列元素只能訪問一次。如 果不使用輔助儲存空間,能否設計 一 個 演算法實現?
分析:計算機技術與數學本身是一家 ,拋開計算機專業知識不提,上述問題其實可以回歸成一
個數學問題。數學問題的目標是在乙個數字序列中尋找重複的那個數。根據題目意思可以看 出, l~1000 個數中除了唯一乙個數重複以外 , 其他各數有且僅有出現 一 次,由數學性質可知, 這 1001 個數包括 1 到 1000 中的每乙個數各 1 次,外加 l 到 1000 中某乙個數,很顯然, 1001 個數中有1000個數是固定的,唯一乙個不固定的數也知道其範圍 cl~1000中某乙個數〉,那 麼最容易想到的方法就是累加求和法。
所謂累加求和法,指的是將陣列中的所有 n+l c此處 n 的值取 1000)個元素相加,然後 用得到的和減去 1+2+3+…n c此處 n 的值為 1000)的和,得到的 差 即為重複的元素的值 。 這一點不難證明。
由於 1001 個數的資料量較大,不方便說明 以上演算法。為了簡化問題,以陣列序列(1,3, 4, 2, 5, 3 )為例。該陣列長度為 6,除了數字 3 以外,其他 4個數字沒有重複。按照上述方法,首先, 計算陣列中所有元素的和 sumb, sumb=1+3+4+2+5+3=18,陣列中只包含 l~5 的數,計算 1 到 5 一共 5個數字的和 suma, suma=1+2+3+4+5=15;所以, 重複的數字的值為 sumb suma鬥。由於 本方法的**實現較為簡單 ,此處就不提供**了,有興趣的讀者可以自己實現。
演算法效能分析:
上述方法的時間複雜度為 o(n),空間複雜度為 0(1)。
採用以上累加求和的方法,雖然能夠解決本題的問題,但也存在乙個潛在的風險, 就是 當陣列中的元素值太大或者陣列太長時, 計算的和值有可能會出現滋出的情況,進而無法求 解出陣列中的唯一重複元素。
鑑於求和法存在的侷限性, 可以來用位運算中異或的方法。根據異或運算的性質可知, 當相同元素異或 時 ,其運算結果為 0,當相異元素異或時,其運算結果為非 0, 任何數與數字 。進行異或運算, 其運算結果為該數。本題中 , 正好可以使用到此方法, 即將陣列裡的元素逐 一進行異或運算, 得到的值再與數字 l、 2、 3…n進行異或運算,得到的最終結果即為所求 的 重複元素。
以陣列(1, 3, 4, 2, 5, 3 )為例。
def finddup(array):
if array==none:
return -1
lens=len(array)
result=0
i=0while iresult^=array[i]
i+=1
j=1while jresult^=j
j+=1
return result
a=[1,3,4,2,5,3]
finddup(a)
輸出:3
找出陣列中唯一的重複元素
問題 1 1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?include include include 根據異或法的計算方式,每兩個相異的數執行異或運算之後,結果為1...
如何找出陣列中唯一的重複元素?
數字1到1000放在含有1001個元素的陣列中,其中只有唯一的乙個元素值重複,其他數字均只出現一次。設計乙個演算法,講重複元素找出來,要求每個陣列元素只能訪問一次。如果不使用輔助儲存空間,能否設計乙個演算法實現?首先在看到這個題的時候,要特別注意幾個條件 1.每個陣列元素只能訪問一次。如果可以訪問多...
Python 如何找出陣列中唯一重複的元素
1.hash法 字典法 空間換時間 def finddup array if array none return 1 lens len array hashtable dict i 0 while i時間和空間複雜度都是o n 2.累加求和法 def finddup array if array n...