問題概要
文字配列を反転させる関数を実装します。入力は文字配列 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"]
解法アプローチ
双方向ポインタを用いた効率的な反転手法:
- 先頭(start)と末尾(end)のポインタを初期化
- ポインタが交差するまで処理を繰り返す
- 各反復で両ポインタ位置の文字を交換
- ポインタを中央方向に移動
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) - 固定サイズの変数のみ使用