【JavaScript】奇数はそのまま、偶数のバイナリ文字列だけを昇順に並べ替える方法
問題
空白文字で区切られた、長さ3のバイナリ(2進数)文字列を含む文字列を受け取り、処理するJavaScript関数を作成します。
要件はシンプルながら少し変わっています。数値を昇順に並べ替えるのはよいものの、並べ替えてよいのは偶数だけで、奇数はすべて元の位置にそのまま残す必要があります。
コード例
以下が実際のコードです −
const str = '101 111 100 001 010';
const sortEvenIncreasing = (str = '') => {
const sorter = (a, b) => {
const findInteger = bi => parseInt(bi, 2);
if(findInteger(a) % 2 === 1 || findInteger(b) % 2 === 1){
return 0;
};
return findInteger(a) - findInteger(b);
};
const res = str
.split(' ')
.sort(sorter)
.join(' ');
return res;
};
console.log(sortEvenIncreasing(str));
出力結果
101 111 100 001 010
コードの解説
- str.split(' ') − 元の文字列を空白で分割し、各バイナリ文字列からなる配列を生成します。
- parseInt(bi, 2) − バイナリ文字列を10進数の整数へ変換するヘルパー関数です。
- sorter(比較関数) − 比較する2つの値のどちらか一方でも奇数であれば
0を返して現在の順序を維持し、両方が偶数の場合は10進値の差を返すことで昇順に並べ替えます。 - join(' ') − 並べ替え後の配列を再び空白区切りの文字列へ連結して返します。
なお、上記のサンプル入力では偶数同士が隣り合っておらず直接の比較が発生しないため、出力は入力とまったく同じ文字列になります。奇数を挟んで離れた位置にある偶数まで確実に並べ替えたい場合は、「偶数の値だけを抽出してソートし、元の偶数の位置へ書き戻す」実装にするとより堅牢です。
より確実な実装例
const sortEvenStrict = (str = '') => {
const arr = str.split(' ');
const evenIdx = [];
const evens = [];
arr.forEach((s, i) => {
if(parseInt(s, 2) % 2 === 0){
evenIdx.push(i);
evens.push(parseInt(s, 2));
}
});
evens.sort((a, b) => a - b);
evenIdx.forEach((idx, k) => {
arr[idx] = evens[k].toString(2).padStart(3, '0');
});
return arr.join(' ');
};
console.log(sortEvenStrict('101 111 100 001 010'));
こちらの出力は 101 111 010 001 100 となります。偶数(010=2、100=4)だけが昇順に入れ替わり、奇数はすべて元の位置に保たれていることが分かります。
-
JavaScriptで文字列内のアルファベットだけを反転する方法
問題の概要JavaScriptで、アルファベットといくつかの特殊文字(記号)が混在する文字列 str を受け取る関数を作成することを求められています。この関数は、入力文字列をもとに新しい文字列を返します。その際のルールは次のとおりです。アルファベット以外の文字(記号・数字など)は、元の位置にそのまま留まります。アルファベットの文字だけが、互いに反転した位置へ移動します。入力例と出力例たとえば、関数への入力が以下だった場合を考えてみましょう。入力const str = k_lmn_opq;出力const output = q_pon_mlk;「_」という記号は位置が変わっておらず、アルファベット
-
C++でバイナリ文字列内の偶数となる10進値の部分文字列を数える方法
0と1のみで構成された文字列が与えられます。この文字列は、左から右に読む2進数を表しており、たとえば「001」は1ではなく4を意味します。今回の目的は、10進数として偶数の値を表すすべての部分文字列を見つけることです。この問題は、各部分文字列の先頭の値を確認するだけで解決できます。先頭が0であればその数は偶数になり、1であれば奇数になります。str[0]=0で始まるすべての部分文字列は10進数で偶数となるため、countに(length - i)を加算していきます。具体例を使って理解しましょう。入力 − str=101出力 − バイナリ文字列における偶数の10進値を持つ部分文字列の数 − 2説