【LintCode】Reverse Words in a String 翻转字符串

来源:互联网 发布:node.js 安装教程 编辑:程序博客网 时间:2024/06/05 12:07

描述:给定一个字符串,逐个翻转字符串中的每个单词。

说明

  • 单词的构成:无空格字母构成一个单词
  • 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
  • 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

样例

给出s = "the sky is blue",返回"blue is sky the"

基本思路: 
1)第一趟遍历 
将每个单词翻转,且去掉连续空格中多余的空格(两端空格早已去掉)。 
2)第二趟遍历 
将整个字符串完全翻转。

代码:
<span style="font-size:18px;">public class Solution {    /**     * @param s : A string     * @return : A string     */    public String reverseWords(String s) {        // write your code        //去掉首尾空格        StringBuffer sb=new StringBuffer(s.trim());      //第一趟遍历 将每个单词翻转,且去掉连续空格中多余的空格(两端空格早已去掉)。         for(int i=0;i<sb.length();){            //删除多余空格            if(i<sb.length()-1&&sb.charAt(i)==' '&&(sb.charAt(i)==sb.charAt(i+1))){                //deleteCharAt(int index);             sb.deleteCharAt(i+1);             i++;             continue;            }                     //将单词翻转            else if(sb.charAt(i)!=' '){              int j=i;              //找到该单词最后一个字母              while(j<sb.length()&&sb.charAt(j)!=' '){                  j++;              }              //将该单词进行翻转              //setCharAt(int index,char ch);              for(int k=0;k<(j-i)/2;k++){                  char c=sb.charAt(k+i);                  sb.setCharAt(k+i,sb.charAt(j-1-k));                  sb.setCharAt(j-1-k,c);              }           //将下标移动到(当前单词后的空格)或下一个单词的首字母处              i=j+1;            }            //一个空格            else {                i++;                }                    }        //第二趟遍历 将整个字符串完全翻转。           for(int i=0;i<sb.length()/2;i++){               char c = sb.charAt(i);               sb.setCharAt(i,sb.charAt(sb.length()-1-i));             //这里不能直接把sb.charAt(i)当做参数写到setCharAt中,必须在前面先对i位置的字符进行获取(保存),因为上面的赋值操作             //对i位置的字符数据进行了覆盖               sb.setCharAt(sb.length()-1-i,c);           }        return sb.toString();    }}</span>



0 0
原创粉丝点击