1. 程式人生 > >【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面

【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面

pen 沒有 name func hide tracking 順序 popu type

題目鏈接地址:
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)復雜度):

設定兩個指向數組的指針,一個初始化數組第一個元素一個初始化最後一個元素,頭指針向後掃描偶數。假設發現偶數,則讓尾指針向前掃描,找出一個奇數。然後兩者交換。

然後繼續頭指針向後掃描,直到尾指針在頭指針的前面。結束。

但交換過程中把奇數之間、偶數之間的順序給打亂了。不符合本題目的要求。
而九度題目進行了改進:


要求調整順序。使得全部奇數在前面,全部偶數在後面,並且奇數之間的順序不能變,偶數之間順序不能變。即“調整順序”和“相對位置不變”。
方法:
  

  1. 一個數組掃描兩次。先後記錄奇數和偶數,再將數組先後寫回原數組。時間和空間復雜度均為O(n)。
  2. 構建兩個數組。記錄奇數和偶數。再將數組寫回原數組,時間和空間復雜度均為O(n)。

  3. 構建兩個單鏈表,一個存放奇數。一個存放偶數;再將奇偶數寫回原數組。時間和空間復雜度均為O(n)。

代碼:

/********************************* 
【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面
Author:牧之丶  Date:2015年
Email:[email protected]
/* */ **********************************/ #include<stdio.h> #include<stdlib.h> #include<string> #include <math.h> #include<stack> #include <vector> #include <iostream> using namespace std; int main() { vector<int> odd, even; int n, i, num; while(scanf("%d", &n)!= EOF){ odd.clear(); even.clear(); for(i = 0; i < n; ++i){ scanf("%d", &num); num & 1 ? odd.push_back(num) : even.push_back(num); } for(i = 0; i < even.size(); ++i){ odd.push_back(even[i]); } printf("%d", odd[0]); for(i = 1; i < odd.size(); ++i){ printf(" %d", odd[i]); } printf("\n"); } return 0; } /************************************************************** Problem: 1516 Language: C++ Result: Accepted Time:80 ms Memory:2552 kb ****************************************************************/

總結:

  • 善用兩個指針
  • 善於開辟數組輔助

【劍指Offer面試題】 九度OJ1516:調整數組順序使奇數位於偶數前面