反转字符串中的单词

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

输入:s = "Let's take LeetCode contest"

输出:"s'teL ekat edoCteeL tsetnoc"

要点:反转字符但是只是其中的单词反转,开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。这其中包括一个新函数,StringBuffer中的append将新字符插入到一个位置中。

代码:class Solution {

    public String reverseWords(String s) {

            StringBuffer   ret=new StringBuffer();

            int length=s.length();

            int i=0;

            while(i<length){

                int start=i;//单词的首字母位置

                while(i<length&&s.charAt(i)!=' '){//遇到空格时跳出,此时已标记空格位置

                    i++;

                }

                for(int p=start;p<i;p++){

                    ret.append(s.charAt(i+start-1-p));//i-1为单词末子母位置,-p代表单词长度,从后向前遍历

                }

                while(i<length&&s.charAt(i)==' '){//进入下一个单词,记录首字母位置,返回给start

                    i++;

                    ret.append(' ');//加空格

                }

            }  

            return ret.toString();

    }

}

(2)另外一种方法就是不借助StringBuilder,直接操作字符数组,把String转为字符数组,原地操作,然后再把字符数组转成String返回。

用双指针指向原数组中的单词首尾,进行反转,然后向前步进到下一个单词。

代码:class Solution {

    public String reverseWords(String s) {

        char[] chars = s.toCharArray();

        for (int i = 0, j = 0; i <= chars.length; i++) {

            if (i == chars.length || chars[i] == ' ') {

                int k = i - 1;

                while (j < k) {

                    char t = chars[k];

                    chars[k] = chars[j];

                    chars[j] = t;

                    j++;

                    k--;

                }

                j = i + 1;

            }

        }

        return new String(chars);

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容