[LeetCode] 151. 翻转字符串里的单词

自己做的错了,没考虑到中间可能有多个空格:

public static String reverseWords(String s){
        String[] s1 = s.trim().split(" ");
        String s2=new String();
        s2=s1[s1.length-1]+" ";
        for(int i=s1.length-2;i>0;i--){
            s2=s2+s1[i]+" ";
        }
        s2=s2+s1[0];
//        s2.trim();
        return s2;
    }

这里如果在用split的时候用的是正则表达式就不会有问题,再利用语言对字符串提供的工具:

class Solution {
    public String reverseWords(String s) {
        // 除去开头和末尾的空白字符
        s = s.trim();
        // 正则匹配连续的空白字符作为分隔符分割
        List<String> wordList = Arrays.asList(s.split("\\s+"));
        Collections.reverse(wordList);
        return String.join(" ", wordList);
    }
}

不得不说,自带的方法真的很慢哈,虽然写起来很简单。

题解中给的方法一:用一个双指针,相当于遍历整个数组

class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        int j=s.length()-1,i=j;
        StringBuilder res=new StringBuilder();
        while(i>=0){
            while(i>=0&&s.charAt(i)!=' ')i--;
            res.append(s.substring(i+1,j+1)+" ");
            while(i>=0&&s.charAt(i)==' ')i--;
            j=i;
        }
        return res.toString().trim();
    }
}

 方法二:

class Solution {
    public String reverseWords(String s) {
        String arr[]=s.split(" ");
        StringBuilder sb = new StringBuilder("");
        for(int i=arr.length-1;i>=0;i--){
            if("".equals(arr[i])){
                continue;
            }
            sb.append(arr[i]).append(" ");
        }
        String res=sb.toString();
        if("".equals(res)){
            return res;
        }
        return res.substring(0,res.length()-1);
    }
}

猜你喜欢

转载自www.cnblogs.com/doyi111/p/12675505.html