第24题 Reverse Words in a String

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

click to show clarification.

Clarification:

  • What constitutes a word?
    A sequence of non-space characters constitutes a word.
  • Could the input string contain leading or trailing spaces?
    Yes. However, your reversed string should not contain leading or trailing spaces.
  • How about multiple spaces between two words?

  • Reduce them to a single space in the reversed string.
Solution in Java
public class Solution {
    public String reverseWords(String s) {
        String[] words  = s.split("\\s+");
        String revWords = "";
        for(int i=words.length-1; i>=0; i--){
           revWords =revWords + words[i]+" ";
        }
        revWords=revWords.trim();
        return revWords;
    }
}
Note:函数split参数可以为正则表达式,\s+表示一个或多个空格,回车,换页符等空白占位符,所以可以表示一个或多个空格。trim()去首尾空格。
Solution in C++ 1:
class Solution {
public:
    void reverseWords(string &s) {
        
        vector<string> words;
        int length = s.length();
        if(length==0) return;
        int start =0, index=0;
        while(index<length){
            if(s[start]==' '){
                start++;
                index++;
            }
            else if(s[index]==' '){
                words.push_back(s.substr(start, index-start));
                start=index+1;
                index=start;
            }
            else{
                index++;
            }
        }
        if(start!=length)   words.push_back(s.substr(start, length-start));
        s="";
        for(int i=words.size()-1; i>0; i--)
            s+=words[i]+" ";
        if(words.size()!=0) s+=words[0];
    }
};
Note: s.substr(start, length-start)返回从start开始,长度length-start的子串。C++本身没有trim()函数,最后一个字符需特殊处理,否则会引入多余的空格。C++和Java串联string都是用"+"号。

Solution in C++ 2:
class Solution {
public:
    void reverseWords(string &s) {
        
        vector<string> words;
        int length = s.length();
        if(length==0) return;
        int start =0, index=0;
        while(start<length&&(index=s.find(' ', start))!=string::npos){
            if(index==start)    start++;
            else{
                words.push_back(s.substr(start, index-start));
                start=index+1;
            }
        }
        if(start<length)    words.push_back(s.substr(start));
        s="";
        for(int i=words.size()-1; i>0; i--)
            s+=words[i]+" ";
        if(words.size()>0)  s+=words[0];
    }
};
Note: C++字符串find函数用法:(原文见http://blog.csdn.net/youxin2012/article/details/9162415)
size_t find (const string& str, size_t pos = 0) const;  //查找对象-- string类对象
size_t find (const char* s, size_t pos = 0) const; //查找对象-- 字符串
size_t find (const char* s, size_t pos, size_t n) const;  //查找对象-- 字符串的前n个字符
size_t find (char c, size_t pos = 0) const;  //查找对象-- 字符
结果:找到 -- 返回 第一个字符的索引
       没找到--返回   string::npos


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值