C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で配列を昇順にソートし、奇数と偶数の値を交互に並べ替える方法

正と負の両方の数を含む整数型の配列 arr[](任意のサイズ)が与えられたとします。この課題は、配列を次のようなルールで並べ替えることです。配列内の最小の要素が奇数である場合、要素は「奇数が先・偶数が後」の交互パターンで並べ替えられます。最小の要素が偶数である場合は、「偶数が先・奇数が後」の交互パターンで並べ替えられます。さらに、偶数(または奇数)の要素数が奇数(または偶数)の要素数より多い場合、余った位置には 0 を配置して結果を出力します。

入出力シナリオの例

入力 − int arr[] = { 1, 1, 2, 2, 5, 4 }

出力 − 昇順に奇数と偶数の値を交互に並べ替えた結果:1 2 1 2 5 4

説明 − 整数型の配列が与えられています。まず配列内の最小の要素を確認すると 1 であり、これは奇数です。そのため、要素は「奇数が先・偶数が後」の交互パターンで並べ替えられ、最終的な出力は 1 2 1 2 5 4 となります。

入力 − int arr[] = { 6, 3, 2, 8, 10, 4 }

出力 − 昇順に奇数と偶数の値を交互に並べ替えた結果:2 3 4 0 6 0

説明 − 整数型の配列が与えられています。まず配列内の最小の要素を確認すると 2 であり、これは偶数です。そのため、要素は「偶数が先・奇数が後」の交互パターンで並べ替えられます。この配列では偶数の要素数が奇数の要素数より多いため、足りない分には 0 が配置されます。

プログラムで使用するアプローチ

  • 整数型の要素からなる配列を入力し、配列のサイズを計算します。

  • C++ STL の sort メソッドを使用し、配列とそのサイズを sort 関数に渡して配列を昇順にソートします。

  • 整数変数を宣言し、関数 Rearrangement(arr, size) の呼び出し結果を設定します。

  • 関数 Rearrangement(arr, size) の内部では、以下の手順を実行します。

    • 整数型データを格納するベクターとして、'vec_1' と 'vec_2' の2つの変数を作成します。

    • 整数型の一時変数 temp を作成し、0 で初期化します。

    • bool 型の変数 check を宣言し、FALSE で初期化します。

    • i を 0 から size 未満まで FOR ループで回します。ループ内で、arr[i] % 2 == 0 であれば arr[i] を vec_1 に push し、そうでなければ vec_2 に push します。

    • 整数変数 i と j を 0 として宣言します。arr[0] % 2 == 0 であれば、check を true に設定します。

    • temp が size 未満である間、WHILE ループを続けます。ループ内で、check == true であれば arr[temp++] に vec_1[i++] を代入して check を反転させ、そうでなければ arr[temp++] に vec_2[j++] を代入して check を反転させます。

  • 結果を出力します。

コード例

#include <bits/stdc++.h>
using namespace std;
void Rearrangement(int arr[], int size){
    vector<int> vec_1, vec_2;
    int temp = 0;
    bool check = false;
    for(int i = 0; i < size; i++){
        if(arr[i] % 2 == 0){
            vec_1.push_back(arr[i]);
        }
        else{
            vec_2.push_back(arr[i]);
        }
    }
    int i = 0;
    int j = 0;
    if(arr[0] % 2 == 0){
        check = true;
    }
    while(temp < size){
        if(check == true){
            arr[temp++] = vec_1[i++];
            check = !check;
        }
        else{
            arr[temp++] = vec_2[j++];
            check = !check;
        }
    }
}
int main(){
    int arr[] = { 1, 1, 2, 2, 5, 4 };
    int size = sizeof(arr) / sizeof(int);
    //sort an array
    sort(arr, arr + size);
    cout<<"Rearrangement of Odd and Even values in Alternate Fashion in Ascending Order is: ";
    Rearrangement(arr, size);
    for(int i = 0; i < size; i++){
        cout << arr[i] << " ";
    }
    return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます。

Rearrangement of Odd and Even values in Alternate Fashion in Ascending Order is: 1 2 1 2 5 4
  1. Pythonでバイナリ文字列を並べ替えて0と1が交互に並ぶようにできるか判定する方法

    問題の概要 長さ2以上のバイナリ文字列 s が与えられたとき、その文字列を並べ替えることで、0と1が交互に並んだ文字列(オルタネート文字列)を作れるかどうかを判定する問題です。 例えば、入力が s = 1000111 の場合、「1」が4個、「0」が3個含まれているため、これらを並べ替えて 1010101 を作ることができます。したがって、出力は True になります。 解法の考え方 0と1が交互に並ぶ文字列では、文字列の長さによって「0」と「1」の出現回数の関係が一意に決まります。 長さが偶数の場合:「0」と「1」の出現回数は必ず等しくなります(例:0101 → 0が2個、1が2個)。 長

  2. Pythonで約数の個数が偶数か奇数かを判定する方法

    ある整数 n が与えられたとき、その約数の総数が偶数か奇数かを判定することを考えます。 例えば、入力が n = 75 の場合を見てみましょう。75 の約数は [1, 3, 5, 15, 25, 75] の 6 個あるため、出力は「偶数(Even)」となります。 効率的な解法のポイント この問題は、シンプルかつ効率的なアプローチで解くことができます。鍵となるのは、次の数学的性質です。 「約数の個数が奇数になるのは、その数が完全平方数である場合のみ」 これは、約数が通常 d と n/d のペアで現れるためです。しかし、n が完全平方数の場合、√n は自分自身とペアになるため、約数の総数が奇数になり