leetcode第一刷_Reverse Words in a String

143 篇文章 0 订阅

这道题非常常见,在primer上甚至有现成的详细代码。主要的思路很简单,先把整个串翻转一下,然后再对每个单词翻转,这样就可以了。

复杂倒不是在这个思路上,而是题目给出的一些限制,比如,输入全空格时,不能返回全空格,而是应该返回“NULL”,还有就是输入的开始和结束都可能有多余的空格,但是输出中这些空格应当删掉,此外,单词之间也可能有多个空格,最后的结果要求只能有一个空格。

在剑指offer上看到这个题时,我的做法是直接翻转,然后找到第一组非空格的单词,直接翻转,这样的做法不能很好的处理上面的要求,因为多余的空格还是多余的显示了。

后来想了一下,想到了stringstream,这个东西是我看了primer之后才知道的,很好用,不过可能用的人并不多。它的用法跟标准输入输出其实没什么区别,用某个string初始化之后,就可以解析这个string了,这样每次读入一个word,然后翻转这个word,并把word之间用一个空格连接起来,解决了这个问题。

下面是我ac的代码,因为只有二十多组测试用例,不能保证完全正确。

class Solution {
public:
    void swap(char &a, char &b){
    	char t = a;
    	a = b;
    	b = t;
    }
    void do_Reverse(string &s, int a, int b){
    	for(int i=a,j=b;i<j;i++,j--){
    		swap(s[i],s[j]);
    	}
    }
    void reverseWords(string &s) {
        do_Reverse(s, 0, s.length()-1);
    	istringstream stream(s);
    	string word, res = "";
    	stream>>word;
    	do_Reverse(word, 0, word.length()-1);
    	if(word != ""){
    		res += word;
    	}
    	while(stream>>word){
    		do_Reverse(word, 0, word.length()-1);
    		res += " "+word;
    	}
    	s = res;
    }
    
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值