JavaScriptで2次元行列を水平方向に反転し、さらにビット反転する方法
問題
0と1のみで構成される2次元のバイナリ配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。
この関数は、まず行列を水平方向に反転(フリップ)し、その後に行列表現上の各値を反転(インバート)して、最終的な結果の行列を返すものとします。
用語の定義
水平方向への反転とは、行列の各行を逆順に並べ替えることを意味します。たとえば、[1, 1, 0] を水平方向に反転すると [0, 1, 1] になります。
反転(インバート)とは、行列内のすべての0を1に、すべての1を0に置き換えることを意味します。たとえば、[0, 1, 1] を反転すると [1, 0, 0] になります。
入力例
const arr = [
[1, 1, 0],
[1, 0, 1],
[0, 0, 0]
];出力例
const output = [
[1, 0, 0],
[0, 1, 0],
[1, 1, 1]
];出力の解説
まず、各行を逆順に並べ替えます。
[[0,1,1],[1,0,1],[0,0,0]]
続いて、行列全体の各要素を反転します。
[[1,0,0],[0,1,0],[1,1,1]]
実装コード
以下が実際のコード例です。
const arr = [
[1, 1, 0],
[1, 0, 1],
[0, 0, 0]
];
const flipAndInvert = (arr = []) => {
const invert = n => (n === 1 ? 0 : 1)
for(let i = 0; i < arr.length; i++) {
for(let j = 0; j < arr[i].length / 2; j++) {
const index2 = arr[i].length - 1 - j
if(j === index2) {
arr[i][j] = invert(arr[i][j])
} else {
const temp = arr[i][j]
arr[i][j] = arr[i][index2]
arr[i][index2] = temp
arr[i][j] = invert(arr[i][j])
arr[i][index2] = invert(arr[i][index2])
}
}
}
};
flipAndInvert(arr);
console.log(arr);実行結果
[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 1, 1, 1 ] ]
処理のポイント
この実装では、各行に対して左右両端から中央に向かって要素を入れ替えながら同時にビット反転を行うことで、余分な配列を生成せずに処理を完了しています。内側のループが行の長さの半分までしか回らないため、計算量はO(n×m)、空間計算量はO(1)と効率的です。また、奇数長の行の場合に中央の要素が二重に反転されないよう、j === index2 のチェックが組み込まれている点も重要なポイントです。
-
new演算子を使ってJavaScriptコンストラクタを作成する方法
JavaScriptでは、通常の関数を「new」演算子と組み合わせて呼び出すことで、コンストラクタとして機能させることができます。これにより、同じ構造を持つ複数のオブジェクトを効率的に生成できます。以下に、new演算子を使用してJavaScriptのコンストラクタを作成するコード例を紹介します。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial
-
Pythonで行列の各行を反転し、ビットを反転させる方法
本記事では、2値行列(0と1のみで構成される行列)を扱うアルゴリズム問題をPythonで解く方法を解説します。具体的には、行列の各行を左右に反転(リバース)した後、各ビットを反転(0を1に、1を0に変換)する処理を実装します。 問題の概要 2値行列 mat が与えられたとします。まず行列内の各行を選択して行を逆順に並べ替え、その後、行内の各要素について0と1を入れ替えます。 例えば、次のような入力が与えられた場合を考えてみましょう。 110010001 この場合、出力は以下のようになります。 100101011 解法のアプローチ この問題は、以下の手順で解決できます。 行インデックス