字符串的一些相关操作

给定一个字符串 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);


    }


}

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

推荐阅读更多精彩内容