【Python】偶数インデックスと奇数インデックスの要素を入れ替える方法
問題の概要
数値のリスト nums が与えられたとき、偶数インデックス(0, 2, 4, ...)に位置する要素同士、および奇数インデックス(1, 3, 5, ...)に位置する要素同士を、それぞれ2個ずつペアとして入れ替えることを考えます。
たとえば、入力が [1,2,3,4,5,6,7,8,9] の場合、出力は [3, 4, 1, 2, 7, 8, 5, 6, 9] になります。インデックス0と2、1と3、4と6、5と7の要素がそれぞれ入れ替わっているのがわかります。
解法のアプローチ
この問題は、以下の手順で解くことができます。
- まず、リスト
numsの長さを取得します。 - インデックス
iを 0 から開始し、4 ずつ増やしながらリストの末尾までループします。 i + 2がリストの範囲内であれば、nums[i]とnums[i+2](偶数インデックス同士)を交換します。i + 3がリストの範囲内であれば、nums[i+1]とnums[i+3](奇数インデックス同士)を交換します。- 最後に、処理済みのリスト
numsを返します。
ステップ幅を 4 にしているのは、1回のループで偶数・奇数それぞれのペア(合計4要素)をまとめて処理するためです。これにより、すべての要素を重複なく効率よく入れ替えられ、計算量は O(n) に収まります。
実装例
理解を深めるために、以下の実装を見てみましょう。
class Solution:
def solve(self, nums):
length = len(nums)
for i in range(0, length, 4):
if(i+2 < length):
nums[i], nums[i+2] = nums[i+2], nums[i]
if(i+3 < length):
nums[i+1], nums[i+3] = nums[i+3], nums[i+1]
return nums
ob = Solution()
nums = [1,2,3,4,5,6,7,8,9]
print(ob.solve(nums))
入力
[1,2,3,4,5,6,7,8,9]
出力
[3, 4, 1, 2, 7, 8, 5, 6, 9]
動作の流れを確認
入力 [1,2,3,4,5,6,7,8,9] の場合、処理は次のように進みます。
- i = 0 のとき:
nums[0]とnums[2]を交換(1 ⇔ 3)、続いてnums[1]とnums[3]を交換(2 ⇔ 4)→[3, 4, 1, 2, 5, 6, 7, 8, 9] - i = 4 のとき:
nums[4]とnums[6]を交換(5 ⇔ 7)、続いてnums[5]とnums[7]を交換(6 ⇔ 8)→[3, 4, 1, 2, 7, 8, 5, 6, 9] - i = 8 のとき:
i + 2もi + 3もリストの範囲外のため、何も行いません。
この結果、最終的な出力は [3, 4, 1, 2, 7, 8, 5, 6, 9] となり、期待どおりの並び順が得られます。なお、Pythonでは a, b = b, a というタプル代入を使うことで、一時変数なしに簡潔に要素を交換できる点もポイントです。
-
Pythonでリスト内の偶数と奇数をカウントする3つの方法を解説
この記事では、リスト内に含まれる偶数と奇数の個数を数える方法について、具体的なコード例とともに解説します。問題の概要課題: 与えられたリストの中から、偶数と奇数がそれぞれいくつ含まれているかをカウントします。ここでは、以下の3つのアプローチを紹介します。それぞれ特徴が異なるため、用途やコードの可読性に応じて使い分けるのがおすすめです。方法1:forループを使った基本的な方法(総当たり方式)最もシンプルで直感的な方法です。拡張forループで各要素を順番に確認し、2で割った余りによって偶数か奇数かを判定します。コード例list1 = [21, 3, 4, 6, 33, 2, 3, 1, 3, 76
-
Pythonで奇数桁と偶数桁の合計の差を判定するプログラム
この記事では、与えられた問題を解決するための解法とアプローチについて詳しく解説します。 問題文 整数が1つ与えられたとき、奇数桁の合計と偶数桁の合計の差が0であるかどうかを判定する必要があります。 素朴なアプローチ(ブルートフォース) 最も単純な方法は、数値を構成するすべての偶数桁と奇数桁の合計をそれぞれ計算し、その差を求めることです。しかし、この方法では各桁を順番に処理するため、桁数に比例した計算時間が必要になります。 効率的なアプローチ:11の倍数判定を活用 計算時間を削減するために、「暗算の数学」でよく知られている性質を利用します。それは「ある整数の奇数桁の合計と偶数桁の合計の差が0にな