力扣面试题11:实现字符串中翻转单词

今天的这道题目算是有点难度的题目,整体来说考察的逻辑挺难的,下面给出实例

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

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

首先我们的需要考虑字符串中有很多空格的情况,因为后面得到的字符串是只有单词之间有空格的,所以我们先需要做去空格操作:代码如下:(我们需要采用双指针的方法)

void DeleteSpace(string s) {
	int fastindex = 0;//定义快指针
	int slowindex = 0;//定义慢指针
	for (; fastindex < s.size(); fastindex++) {
		if (s[fastindex] != ' ') {//如果找到单词里面的字母了
			if (slowindex != 0)s[slowindex++] = ' ';//如果慢指针往后移动了,就给个空格在下一个单词的前面
			while (fastindex < s.size() && s[fastindex] != ' ') {//将单词里面的字母赋值给慢指针
				s[slowindex++] = s[fastindex++];
			}
		}
	}
   s.resize(slowindex);
}

进行完去空格操作后,就要对字符串进行翻转了;下面是翻转的函数:

void Reversestring(string s,int start,int end) {
	for (int i = start,j=end; i < j; i++,j--) {
		swap(s[i], s[j]);
	}
}

然后再对一个个单词进行翻转

string reversewords(string s) {
	Delete(s);//首先去空格操作
	Reversestring(s, 0, s.size() - 1);//将整个字符串进行翻转
	int start = 0;
	for (int i = 0; i <= s.size();i++) {
		if (i==s.size() || s[i] = ' ') {//如果遍历到了字符串尾部 或者遍历到了空格,就翻转这个单词
			Reversestring(s, start, i - 1);
			start = i + 1;//让start+1跳过空格
		}
	}
	return s;
}

今天的分享就到这里,点个赞吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值