LeetCode 186 - Reverse Words in a String II
931 ワード
Reverse Words in a Stringと似ていますが、ここではin-place、つまり余分な空間を開く必要はありません.
[解析]この問題はLeetCodeで先頭と末尾にスペースがなく、単語の間にスペースが1つしかないと仮定します.しかし、これらの仮定を必要としなくてもいいです.コードが複雑になるということです.考え方は2つのステップで、最初のステップは文字列全体を反転することです.次に、最初から徐々にスキャンして、単語に遭遇したたびに反転します.
[注意点]1)Javaであれば、Stringはimmutableだと面接官に指摘すべきなので、char arrayでやる必要があります.2)follow-up問題:k-step reverse.すなわち,第2部で反転する場合,k個の単語を1つの長い単語と見なして反転する.
[解析]この問題はLeetCodeで先頭と末尾にスペースがなく、単語の間にスペースが1つしかないと仮定します.しかし、これらの仮定を必要としなくてもいいです.コードが複雑になるということです.考え方は2つのステップで、最初のステップは文字列全体を反転することです.次に、最初から徐々にスキャンして、単語に遭遇したたびに反転します.
[注意点]1)Javaであれば、Stringはimmutableだと面接官に指摘すべきなので、char arrayでやる必要があります.2)follow-up問題:k-step reverse.すなわち,第2部で反転する場合,k個の単語を1つの長い単語と見なして反転する.
public void reverseWords(char[] s) {
reverse(s, 0, s.length);
for (int i=0, j=0; j<=s.length; j++) {
if (j==s.length || s[j]==' ') {
reverse(s, i, j);
i = j + 1;
}
}
}
private void reverse(char [] s, int begin, int end) {
for (int i=0; i<(end-begin)/2; i++) {
char temp = s[begin+i];
s[begin+i] = s[end-i-1];
s[end-i-1] = temp;
}
}