Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】配列をk回右に回転した後のi番目の要素を求めるプログラム

問題の概要

配列 nums と整数 k、さらにインデックス i が与えられたとします。このとき、nums の要素を右方向に k 回回転させた後の、インデックス i の位置にある要素を求めるのが目的です。

具体例

例えば、nums = [2,7,9,8,10]k = 3i = 2 の場合を考えてみましょう。

  • 1 回目の回転後:[10, 2, 7, 9, 8]
  • 2 回目の回転後:[8, 10, 2, 7, 9]
  • 3 回目の回転後:[9, 8, 10, 2, 7]

3 回の回転が完了すると配列は [9,8,10,2,7] となるため、求める要素は nums[2] = 10 です。

解法のアプローチ

この問題は、以下の手順で解くことができます。

  1. r を 0 から k-1 まで繰り返します。
  2. 各反復で、nums の末尾の要素を取り除き(pop)、その要素を先頭(インデックス 0)に挿入(insert)します。
  3. k 回の回転が完了したら、nums[i] を返します。

「末尾の要素を取り出して先頭に移す」という操作を 1 回行うたびに、配列全体が 1 つ分だけ右にずれるため、これを k 回繰り返せば目的の状態になります。

実装例(Python)

def solve(nums, k, i):
    for r in range(k):
        nums.insert(0, nums.pop())
    return nums[i]

nums = [2,7,9,8,10]
k = 3
i = 2
print(solve(nums, k, i))

コードの解説

  • nums.pop():リストの末尾から要素を取り出します。
  • nums.insert(0, ...):取り出した要素をリストの先頭(インデックス 0)に挿入します。
  • この一連の操作を range(k) によってちょうど k 回繰り返し、最後に nums[i] を返しています。

入力

[2,7,9,8,10] , 3, 2

出力

10

補足:より効率的な実装

上記の方法は計算量が O(k × n) となります。配列が長く、k も大きい場合は、以下のようにスライスを活用すると O(n) で処理でき、より効率的です。

def solve(nums, k, i):
    k %= len(nums)
    rotated = nums[-k:] + nums[:-k]
    return rotated[i]

k %= len(nums) により、k が配列長より大きい場合でも余分な回転を省けます。また、nums[-k:] で末尾 k 個の要素を、nums[:-k] で残りの前半部分を取得して結合することで、一度に回転後の配列を作成できます。

  1. Pythonで配列内の最大の要素を見つける方法を解説

    この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を

  2. Pythonで配列内の最大要素を見つける方法【初心者向け解説】

    本記事では、配列の中から最大の要素を見つけるための解法とアプローチについて詳しく解説します。 問題の概要 配列が入力として与えられたとき、その中から最も大きい要素を見つけ出すことが課題となります。 アプローチ この問題は「線形探索」と呼ばれるシンプルな手法で解決できます。手順は以下の通りです。 まず、変数 max を配列の最初の要素で初期化します。 次に、2番目の要素から配列の末尾まで順番に走査していきます。 走査中の各要素について、現在の max の値と比較します。 要素が max より大きければ、max の値をその要素で更新します。 そうでなければ、そのまま次の要素へ進みます。 この処