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