反转字符串中的单词难度5星

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

 

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

  1. 本题的难度很大,首先第一步是去除单词中所有的空格,并且在单词的间隙之间加上空格,这个难度有亿点大,用到了之前双指针删除数组中指定元素的思想
  2. 再就是反转整个s
  3. 最后是反转s中的单词(遇到空格就反转,但是i要运行到s.size()的位置,方便判断)
  4. class Solution {
    public:
    	void removeSpace(string& s) {//用到了之前的一道题目的思想。数组删除一类元素并不简单,但是这里的再加上空格难度再加上一层
    		int slow = 0;
    		int fast = 0;
    		for (; fast < s.size(); fast++) {
    			if (s[fast] != ' ') {
    				if (slow != 0) {
    					s[slow++] = ' ';
    				}
    				while (fast<s.size()&&s[fast]!=' ') {
    					s[slow] = s[fast];
    					slow++;
    					fast++;
    				}
    			}
    		} //注意到这里删除元素的目的已经达到,但是数组的长度还是没有改变的,所以返回的一定是有多余元素的
    		s.resize(slow);
    	}
    	void reverses(string& s,int begin,int end) {
    		char change;
    		for (; begin <= end; end--, begin++) {
    			change = s[end];
    			s[end] = s[begin];
    			s[begin] = change;
    		}
    	}
    	string reverseWords(string s) {
    		removeSpace(s);
    		reverses(s,0,s.size()-1);
    		int start = 0;
    		for (int i = 0; i <= s.size(); i++) {
    			while (i < s.size()) {
    				if (s[i] == ' '||s[i]==NULL){
    					reverses(s, start, i - 1);
    					start = i + 1;
    					break;
    				}
    				i++;
    			}
    		}
    		return s;
    	}
    };
    

      

posted @ 2022-09-05 10:51  铜锣湾陈昊男  阅读(8)  评论(0)    收藏  举报