[Jobdu] 題目1516:調整數組順序使奇數位於偶數前面


題目描述:

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的后半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

 

輸入:

每個輸入文件包含一組測試案例。
對於每個測試案例,第一行輸入一個n,代表該數組中數字的個數。
接下來的一行輸入n個整數。代表數組中的n個數。

 

輸出:

對應每個測試案例,
輸入一行n個數字,代表調整后的數組。注意,數字和數字之間用一個空格隔開,最后一個數字后面沒有空格。

 

樣例輸入:
5
1 2 3 4 5
樣例輸出:
1 3 5 2 4

對於普通的交換順序,只要設兩個指針分別從頭跟尾掃描,當分別遇到不符合條件的位置時停止,然后交換位置,這樣只要時間O(n),空間O(1),但是這樣做會改變原來的順序,要保持原來的位置,可以借用一個隊列,先將一類數放到正確的位置上,再將隊列里的數放到剩下的位置。時間仍為O(n),但是要用額外空間,大小取決於輸入。最壞情況下空間為O(n)。

 1 #include <stack>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <queue>
 5 using namespace std;
 6  
 7 int main() {
 8     //freopen("1516.input", "r", stdin);
 9     vector<int> v;
10     queue<int> q;
11     int n;
12     while (scanf("%d", &n) != EOF) {
13         v.resize(n);
14         for (int i = 0; i < n; ++i) {
15             scanf("%d", &v[i]);
16         }
17         int count = 0;
18         for (int i = 0; i < n; ++i) {
19             if (v[i] % 2 == 1) {
20                 v[i - count] = v[i];
21             } else {
22                 ++count;
23                 q.push(v[i]);
24             }
25         }
26         for (int i = n - count; i < n; ++i) {
27             v[i] = q.front();
28             q.pop();
29         }
30         for (int i = 0; i < n; ++i) {
31             (i == n - 1) ? printf("%d\n", v[i]) : printf("%d ", v[i]);
32         }
33     }
34     return 0;
35 }
36              
37 /**************************************************************
38     Problem: 1516
39     User: hupo250
40     Language: C++
41     Result: Accepted
42     Time:90 ms
43     Memory:2048 kb
44 ****************************************************************/

 

附上通過交換元素不保持相對順序的代碼。

#include <vector>
#include <cstdio>
#include <iostream>
using namespace std;

int main() {
    //freopen("1516.input", "r", stdin);
    int n;
    vector<int> v;
    while (scanf("%d", &n) != EOF) {
        v.resize(n);
        for (int i = 0; i < n; ++i) {
            scanf("%d", &v[i]);
        }
        int s = 0, e = n - 1, t;
        while (s < e) {
            while (!v[s] & 1 && s < e) ++s;
            while (v[s] & 1 && s < e) --e;
            t = v[s];
            v[s] = v[e];
            v[e] = t;
        }
        for (int i = 0; i < n; ++i) {
            (i == n - 1) ? printf("%d\n", v[i]) : printf("%d ", v[i]);
        }
    }
    return 0;
}
            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM