重排陣列;及消失的數字分析
今日面試題:重排陣列
有原陣列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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 查詢提示;及重排陣列分析陣列
- 448. 找到所有陣列中消失的數字陣列
- 淦448. 找到所有陣列中消失的數字陣列
- 力扣448. 找到所有陣列中消失的數字力扣陣列
- LeetCode-448-找到所有陣列中消失的數字LeetCode陣列
- 消失的數字;及格點數目分析
- 陣列多重排序陣列排序
- 找數字;及最長等差數列分析
- 缺失的數字;及找數字分析
- 陣列中重複的數字陣列
- 陣列和;及此起彼伏分析陣列
- 找數字續;及缺失的數字分析
- 燈;及陣列統計分析陣列
- 陣列統計;及樹的高度分析陣列
- 找陣列的波谷;及巧妙排序的分析陣列排序
- 陣列(2)陣列運算及典例(求解素數的方法)陣列
- JavaScript求陣列數字的平均值JavaScript陣列
- 又見排序;及陣列和分析排序陣列
- 面試題 17.04. 消失的數字面試題
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- 找到陣列中出現特定次數數字的問題陣列
- 劍指offer:旋轉陣列的最小數字陣列
- JZ-050-陣列中重複的數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 刪除排序陣列中的重複數字排序陣列
- 繩子的長度;及找陣列的波谷分析陣列
- 統計陣列中各數字(元素)出現的次數陣列
- 陣列中出現次數超過一半的數字陣列
- 計算陣列中每個數字出現的次數陣列
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 九度 1349 數字在排序陣列中出現的次數排序陣列
- 劍指Offer--陣列中重複的數字陣列
- [劍之offer] 03 陣列中重複的數字陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 【.Net】從字串陣列中尋找數字的元素字串陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- L2-022 重排連結串列【陣列】陣列
- 資料轉換-整數字節陣列陣列