【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面
題目鏈接地址:
http://ac.jobdu.com/problem.php?pid=1516
題目1516:調整數組順序使奇數位於偶數前面
時間限制:1 秒內存限制:128 兆特殊判題:否提交:2858解決:924
題目描寫敘述:
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部的奇數位於數組的前半部分,全部的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
輸入:
每一個輸入文件包括一組測試案例。
對於每一個測試案例。第一行輸入一個n,代表該數組中數字的個數。
接下來的一行輸入n個整數。
代表數組中的n個數。
輸出:
相應每一個測試案例,
輸入一行n個數字,代表調整後的數組。註意。數字和數字之間用一個空格隔開,最後一個數字後面沒有空格。
例子輸入:
5
1 2 3 4 5
例子輸出:
1 3 5 2 4
思路分析:
劍指offer書上的問題比較簡單。沒有要求順序不能變。方法(O(n)復雜度):
設定兩個指向數組的指針,一個初始化數組第一個元素一個初始化最後一個元素,頭指針向後掃描偶數。假設發現偶數,則讓尾指針向前掃描,找出一個奇數。然後兩者交換。然後繼續頭指針向後掃描,直到尾指針在頭指針的前面。結束。
但交換過程中把奇數之間、偶數之間的順序給打亂了。不符合本題目的要求。
而九度題目進行了改進:
要求調整順序。使得全部奇數在前面,全部偶數在後面,並且奇數之間的順序不能變,偶數之間順序不能變。即“調整順序”和“相對位置不變”。
方法:
- 一個數組掃描兩次。先後記錄奇數和偶數,再將數組先後寫回原數組。時間和空間復雜度均為O(n)。
- 構建兩個數組。記錄奇數和偶數。再將數組寫回原數組,時間和空間復雜度均為O(n)。
- 構建兩個單鏈表,一個存放奇數。一個存放偶數;再將奇偶數寫回原數組。時間和空間復雜度均為O(n)。
代碼:
/*********************************
【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面
Author:牧之丶 Date:2015年
Email:[email protected]
總結:
- 善用兩個指針
- 善於開辟數組輔助
【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面