51. Reverse Words in a String : Inputが"the sky is blue"のとき、"blue is is blue "と出力されてしまう。（期待結果："blue is sky the"）


現在、leetcodeの151. Reverse Words in a Stringを解いています。  
下記に問題文(*1)と例(*2)、コード(*3)を載せています。

事象としては、与えられた文字列が"the sky is blue"のとき、"blue is is blue "と出力されてしまいます。  
期待結果は"blue is sky the"です。

反転が失敗している原因と修正方法について教えていただきたいです。

*1  
入力文字列 s が与えられた場合、単語の順序を逆にします。

単語は、スペース以外の文字のシーケンスとして定義されます。 s 内の単語は少なくとも 1 つのスペースで区切られます。

単一のスペースで連結された単語の文字列を逆順で返します。

s には、先頭または末尾のスペース、または 2
つの単語の間に複数のスペースが含まれる場合があることに注意してください。返される文字列には、単語を区切るスペースが 1
つだけ含まれている必要があります。余分なスペースは含めないでください。

*2  
Example 1:

Input: s = "the sky is blue"  
Output: "blue is sky the"

*3
[code]

    class Solution {
        public String reverseWords(String s) {
            s = s.trim();
            String [] array = s.split(" ");
            String ans = "";
            int length = array.length -1;
            for (int i =0; i < array.length; i++){
                swap(i, array, length-i);
                ans += array[i] + " ";
            }
    
            return ans.toString();
        }
    
        public void swap (int index, String [] array, int len){
            String tmp = array[index];
            array[index] = array[len];
            array[len] = tmp;
        }
    }
    
[/code]




4要素の配列を逆順にしたいなら、交換する回数は2回だけのはずです([0]と[3]、[1]と[2])。しかし、このコードでは4回交換しています。

自分だったら配列要素の交換はせず、配列を逆順に見て結果の文字列を組み立てます。

