文字配列の反転操作

問題概要

文字配列を反転させる関数を実装します。入力は文字配列 s で、以下の条件を満たす必要があります:

  • 追加の配列を割り当てない
  • 入力配列をその場で変更
  • O(1) の追加メモリのみ使用

入力例

<strong>入力:</strong>s = ["h","e","l","l","o"]
<strong>出力:</strong>["o","l","l","e","h"]
<strong>入力:</strong>s = ["H","a","n","n","a","h"]
<strong>出力:</strong>["h","a","n","n","a","H"]

解法アプローチ

双方向ポインタを用いた効率的な反転手法:

  1. 先頭(start)と末尾(end)のポインタを初期化
  2. ポインタが交差するまで処理を繰り返す
  3. 各反復で両ポインタ位置の文字を交換
  4. ポインタを中央方向に移動

Java実装例

public class StringReverser {
    public void reverseCharacters(char[] characters) {
        int start = 0;
        int end = characters.length - 1;
        
        while (start < end) {
            char temporary = characters[end];
            characters[end] = characters[start];
            characters[start] = temporary;
            
            start++;
            end--;
        }
    }
}

C++実装例

#include <vector>
using namespace std;

class Solution {
public:
    void reverseCharacters(vector<char>& chars) {
        int startIndex = 0;
        int endIndex = chars.size() - 1;
        
        while (startIndex < endIndex) {
            swap(chars[startIndex], chars[endIndex]);
            startIndex++;
            endIndex--;
        }
    }
};

計算効率

  • 時間計算量: O(n) - 配列の半分を走査
  • 空間計算量: O(1) - 固定サイズの変数のみ使用

タグ: 文字列処理 双方向ポインタ アルゴリズム Java C++

6月27日 01:32 投稿