Pythonで配列の全要素のXOR(排他的論理和)を計算するプログラム
問題概要
整数 n と整数 start が与えられます。ここで、nums[i] = start + 2*i(i は 0 から開始)という規則に従う配列 nums を作成します。配列のサイズは n です。そして、配列内のすべての要素のビットごとの XOR(排他的論理和)を求めます。
たとえば、入力が n = 6、start = 2 の場合、出力は 14 になります。配列は [2+2*0, 2+2*1, ... , 2+2*5]、すなわち [2, 4, 6, 8, 10, 12] となり、これらの要素すべてを XOR すると 14 になるためです。
解き方の手順
この問題を解くには、次の手順に従います。
- 変数 count を start で初期化する
- n - 1 > 0 の間、以下を繰り返す
- count := count XOR (2 + start)
- n := n - 1
- start := start + 2
- count を返す
このアプローチでは、ループの各ステップで「前回の start より 2 大きい値」を count に XOR していくため、配列を実際に生成することなく結果を求められます。計算量は O(n)、追加のメモリは O(1) で済むのがポイントです。
Pythonでの実装例
理解を深めるために、以下の実装例を見てみましょう。
def solve(n, start):
count = start
while n-1 > 0:
count ^= 2 + start
n -= 1
start += 2
return count
n = 6
start = 2
print(solve(n, start))
入力
6, 2
出力
14
処理の流れを確認
n = 6、start = 2 の場合、ループは 5 回実行され、次のように計算が進みます。
- 初回:count = 2(配列の最初の要素)
- 2 回目以降:2, 4, 6, 8, 10, 12 を順番に XOR していき、最終的に 14 が得られる
まとめ
このように、配列を明示的に構築しなくても、while ループと XOR 演算子(^)を組み合わせることで、等差数列的な要素を持つ配列全体の XOR をシンプルかつ効率的に計算できます。ビット演算の基礎を固める練習問題として、ぜひ実際にコードを動かして挙動を確かめてみてください。
-
Pythonで配列の反転数(転倒数)をカウントする方法
はじめに この記事では、配列内の反転(インバージョン)をカウントする問題とその解決策について詳しく解説します。 問題定義 問題: リストが与えられたとき、その中に含まれる反転の数をカウントして表示します。 反転数とは、配列を昇順にソートされた状態にするために必要な入れ替え(スワップ)の回数を表す指標です。具体的には、i < j かつ arr[i] > arr[j] を満たす要素のペア(i, j)の総数として定義されます。 実装例 # 反転数をカウントする関数 def InvCount(arr, n): inv_count = 0 for i in range(n
-
Pythonでアナグラム部分文字列検索プログラムを作成する方法
はじめに この記事では、以下の問題文に対する解決策について学びます。 問題文 − テキストとパターンが与えられたとき、テキスト内に含まれるパターンおよびその順列(アナグラム)の出現位置をすべて出力します。 例えば、テキストが「TUTORIALSPOINT」、パターンが「TOR」であれば、「ROT」や「OTR」といった並べ替えも検索対象となります。 アルゴリズムの考え方 この問題は、スライディングウィンドウ(滑動窓)と文字カウント配列を組み合わせることで効率的に解くことができます。手順は以下のとおりです。 パターン内の各文字の出現回数を、カウント配列 countP に記録します。 テキストの先