[Jobdu]タイトル1516:奇数が偶数の前になるように配列順序を調整する

9562 ワード

タイトルの説明:
整数配列を入力し、すべての奇数が配列の前半に位置し、すべての偶数が配列の後半に位置し、奇数と奇数、偶数と偶数の間の相対位置が変わらないことを保証する関数を実現します.
 
入力:
各入力ファイルには、テストケースのセットが含まれています.各テストケースについて、最初の行にnを入力し、その配列の数を表します.次の行にはn個の整数を入力します.配列内のn個の数を表します.
 
出力:
各テストケースに対応して、調整された配列を表すn個の行を入力します.数字と数字の間にはスペースがあり、最後の数字の後ろにはスペースがありません.
 
サンプル入力:
5

1 2 3 4 5


サンプル出力:
1 3 5 2 4

通常の交換順序については,2つのポインタをそれぞれ先頭と末尾に走査し,それぞれ条件に合わない位置に遭遇した場合に停止し,その後位置を交換することで,時間O(n),空間O(1)が必要であるが,これにより元の順序が変化し,元の位置を保つには,1つのキューを借りて,まず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
", 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
", v[i]) : printf("%d ", v[i]); } } return 0; }