重排陣列;及消失的數字分析

紫鳳發表於2013-08-28

今日面試題:重排陣列

有原陣列S和目標陣列T兩個陣列,它們分別是0-n-1 n個數字的某一種排列的結果。請給出程式,完成從S到T的變換,注意:只允許使用一種操作:陣列中的其他元素可以0交換。

例如:S={0,1,2},T={0,2,1}。變換過程中,只允許1和2於0進行交換。下面是一種可行方法:{0,1,2}=>{2,1,0}=>{2,0,1}=>{0,2,1}

===============================================

消失的數字分析

原題

從1到n,n個數字,每個數字只出現一次。現在,隨機拿走一個數字,請給出方法,找到這個數字。

如果隨機拿走兩個數字呢?

如果隨機拿走k個數字呢?

分析

看微博上,有的同學說,題目描述不清楚,最好有一個例子說明。確實應當如此。爭取以後多用例子進一步說明題意。

這個題目的含義是:n-1互不相同的整數,取值範圍是[1,n],請找到1-n中,沒有出現的整數(好像更難理解了:))。

當缺少一個數字的時候,很簡單,計算1到n的和sum_more,然後再將n-1個整數求和,得到sum_less,則消失的數字就是(sum_more - sum_less)。

如果消失兩個數字呢?按照上面的方法,假設消失的兩個數字分別為a和b,1 <= a, b <= n,我們可以得到a + b = sum_more - sum_less。只有一個等式,無法確定a和b的值是多少。根據我們以前學習解方程式的經驗,我們還需要一個等式,才能確定a和b的值。現在已知的條件,就只有sum_more,sum_less,這兩個分別是n個數的和,以及n-2個數的和,則最終還是要在這些數字的運算形式上做文章。考慮如下兩個形式:

square_sum_more = n個數的平方和

square_sum_less = n-2個數的平方和

有,square_sum_more - square_sum_less = a ^ 2 + b ^ 2。又構造了一個式子。這樣解如下兩個式子,得到a和b,即可:

square_sum_more - square_sum_less = a ^ 2 + b ^ 2

sum_more - sum_less = a + b

解比較簡單了,由第二個式子得:b = sum_more - sum_less - a,帶入第一個式子,則第一個式子,只有a。

如果消失三個數字呢?根據上面處理兩個數字的情況,有如下的式子:

sum_more - sum_less = a + b + c

square_sum_more - square_sum_less = a ^ 2 + b ^ 2 + c ^ 2

cube_sum_more - cube_sum_less = a ^ 3 + b ^ 3 + c ^ 3

解出a,b,c即可。

依次類推,當消失k個數字的時候,演算法的時間複雜度為O(kn)。

另外,微博上的一位同學@曹鵬博士,給出了一個O(nlogn)的解法,也是非常巧妙的,具體是採用分治法:知道1-n最低bit有多少個為0,多少個為1。然後統計一下,給出的數最低bit有多少個為0,多少個為1;然後就知道從最低bit為0的那部分取走了k0個數,從最低bit為1那部分取走了k1個數。 其中,k0 + k1 = k。 然後把那些數按照最低bit為0,為1分開。問題變為兩個子問題k0,k1,然後再考慮次低bit。很不錯的解法。

【分析完畢】

本文來自微信:待字閨中,2013-08-23釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章