LeetCode 151.Reverse Words in a String【Java】

题目描述

反转字符串里的单词

AC代码

思路就是:先反转每一个单词,然后再去反转整个字符串。
1.reverse函数中为什么ch=reverse(ch,i,j-1);,我们用j表示空格在哪儿,所以下标j所对应的值是个空格,我们交换的end应该是第一个空格前面的字符,所以需要j-1。
2.在进行整体反转的时候为什么需要去掉多余的部分?因为有的字符串可能存在多余的空格,进行反转之后是多余的空格是不存在的,字符串头尾不存在空格,单词之间最多只有一个,所以反转后会有空出来的位置,那么这些位置上就会存在其他的单词,我们的结果不需要这些富余字符,所以需要截取。

/*
                    the sky is blue
先反转每个单词:      eht yks si eulb
然后反转整个字符串:   blue is sky the
*/
class Solution {
    public String reverseWords(String s) {
        int k=0;
        char[] ch=s.toCharArray();
        for(int i=0;i<ch.length;i++){
        	//寻找第一个单词的第一个位置,第一个字符可能是空格
            while(i<ch.length&&ch[i]==' ')i++;
            if(i==ch.length)break;
            int j=i;
            //通过空格分隔单词
            while(j<ch.length&&ch[j]!=' ')j++;
            //反转单词
            ch=reverse(ch,i,j-1);
            //添加空格分割单词和单词
            if(k!=0) ch[k++]=' ';
            //修改字符数组
            while(i<j){
                ch[k++]=ch[i++];
            } 
        }
        //去掉多余部分后的字符串进行整体反转
        StringBuilder sb=new StringBuilder(new String(ch).substring(0,k)).reverse();
		return sb.toString();
    }
	
	//字符串反转
    public char[] reverse(char[] array,int i,int j){
        while(i<j){
            char c=array[i];
            array[i]=array[j];
            array[j]=c;
            i++;j--;
        }
        return array;
    }
}

还有其它的做法,可以充分利用String类的方法、双指针去解决。

发布了201 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40992982/article/details/105498784