美文网首页
Reverse Words in a String

Reverse Words in a String

作者: 瞬铭 | 来源:发表于2020-01-14 11:31 被阅读0次

https://leetcode.com/problems/reverse-words-in-a-string/
给定一个String,求出这个String 的字符串反转,反转后的以空格为区分的单词需要保持原顺序
例如String = "the sky is blue" ,反转后的结果为"blue is sky the",附加条件:两个单词之间或者句子的收尾可能有多个空格,需要去除掉这些多余的空格,例如String = " hello world! " ,反转后的结果应该为"world! hello"

思路(String 中没有多余空格)

先说没有多个空格的做法,思路很多,常见的有,直接反转原String,然后以空格为区分,再对每个单词做反转

public String reverseWords(String s) {
        if (s == null) {
            return s;
        }
        String revS = reverse(s, 0, s.length() - 1);
        StringBuilder res = new StringBuilder();
        int start = 0, end = 1;
        while (end < s.length()) {
            if (revS.charAt(end) == ' ') {
                revS = reverse(revS, start, end - 1);
                start = end + 1;
            }
            end++;
        }
        revS = reverse(revS, start, end - 1);
        return revS;
    }

    public String reverse(String s, int i, int j) {
        if (s == null || i >= j) {
            return s;
        }
        StringBuilder s1 = new StringBuilder(s);
//        s1.setCharAt(0,'') = 's';
        while (i <= j) {
            char tmp = s1.charAt(i);
            s1.setCharAt(i, s1.charAt(j));
            s1.setCharAt(j, tmp);
            i++;
            j--;
        }
        return new String(s1);
    }

思路2(String中有多余空格)

如果String有多余空格,不能按照翻转句子,再翻转单词的标准来进行操作了,因为,可以以一个StringBuilder做为变量,逐步遍历每一个char
talk is cheap,show me your example

"  hello world!  "
-------------------------------------------------
整体翻转 sb = "  !dlrow olleh  "
storeIndex 记录翻转后的单词末尾Index
-------------------------------------------------
i = 0  sb[0] == ' ' 继续
-------------------------------------------------
i = 1  sb[1] == ' ' 继续
-------------------------------------------------
i = 2 sb[2] == ' h' ,因为此时storeIndex为0,表明上一个没单词,不用再sb的storeIndex的位置加‘ ’
      j = i,  
      遍历到j为' '的时候循环终止,得到sb = '!dlrowow olleh  '
      此时storeIndex = 6,j = 8;
针对storeIndex前面的单词,进行翻转,得到sb = 'world!ow olleh  '
置放i = j = 8

-------------------------------------------------
i = 9 sb[2] == ' o' ,因为此时storeIndex为6,表明上一个有单词,需要sb后面加一个' ',所以此时sb = sb = 'world! w olleh  '
    j=i
    遍历到j为' '的时候循环终止,得到sb = 'world! olleheh '
此时storeIndex=12,j=14
针对storeIndex前面的单词,进行翻转,得到sb = 'world! helloeh '
i = j = 14;
-------------------------------------------------
i = 14 结束循环
设置sb为当前长度

StringBuilder有reverse的函数

    public String reverseWords2(String s) {
        int storeIndex = 0, n = s.length();
        StringBuilder sb = new StringBuilder(s).reverse();
        for (int i = 0; i < n; ++i) {
            if (sb.charAt(i) != ' ') {
                if (storeIndex != 0) sb.setCharAt(storeIndex++, ' ');
                int j = i;
                while (j < n && sb.charAt(j) != ' ') {
                    sb.setCharAt(storeIndex++, sb.charAt(j++));
                }
                String t = new StringBuilder(sb.substring(storeIndex - (j - i), storeIndex)).reverse().toString();
                sb.replace(storeIndex - (j - i), storeIndex, t);
                i = j;
            }
        }
        sb.setLength(storeIndex);
        return sb.toString();
    }

相关文章

网友评论

      本文标题:Reverse Words in a String

      本文链接:https://www.haomeiwen.com/subject/eywoactx.html