java初学者です。leetcodeというサイトで再帰の学習をしていたのですが、解法として記載されていたコードの理解がトレースしても理解できなかったため、ご助言をいただきたいです。
文字列を再帰的に反転させる方法の一例として、以下がSolutionとして記載されていました。
java
1class Solution { 2 public void helper(char[] s, int left, int right) { 3 if (left >= right) return; 4 char tmp = s[left]; 5 s[left++] = s[right]; 6 s[right--] = tmp; 7 helper(s, left, right); 8 } 9 10 public void reverseString(char[] s) { 11 helper(s, 0, s.length - 1); 12 } 13}
このコードを読んだだけでは理解できなかったため、トレースしようと思い、
例えば"hello"という文字列で考えた場合、sははじめ
0 1 2 3 4
h e l l o
で、
left = 0
right = 4
となるかと思います。ここからコードの通り処理を追って行くと、
tmp = h
s[left++] = s[1] = o
s[right--] = s[3] = h
となり、この時点で文字列が
0 1 2 3 4
h o l h o
となる、と解釈したのですが、これではs[1]のeの文字が上書き?されているので、その後反転した文字列を形成できないのでは?と思いました。
さらに再帰の処理をすすめた場合、
helper(s , 1, 3)
tmp = o
s[2] = h
s[2] = o
となり、s[2]に対して処理を2回することになるもの不可解で、混乱しております。
トレース方法や処理の解釈が違っているのだと思いますが、ご指摘をお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/04 02:29