剑指 Offer 58 - I. 翻转单词顺序(C++实现)

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof
 

  1. 先处理字符串中 前置、中间、后置 多余的空格
  2. 再对字符串进行两次反转
  3. 一次整体反转,一次对每个单词进行单独反转
string reverseWords(string s) {

	int n = s.size();

	// 先处理前中后多余的空格
	int fast = 0, slow = 0;
	while (fast != n && s[fast] == ' ')			// 先除去前置空格
	{
		++fast;
	}
	// base case,字符串为空 或 只有空格 的情况
	if (fast == n)
	{
		return {};
	}
	while (fast != n)
	{
		while (fast != n && s[fast] != ' ')		// 复制单词
		{
			s[slow++] = s[fast++];
		}
		
		while (fast != n && s[fast] == ' ')		// 跳过中间的空格
		{
			++fast;
		}

		s[slow++] = ' ';						// 中间只加一个空格
	}

	// 实际长度为 slow - 1,除去最后一个多加的空格
	s = s.substr(0, slow - 1);

	// 进行两次反转
	reverse(s.begin(), s.end());			// 先整体反转一次

	fast = 0;
	slow = 0;
	n = s.size();
	while (fast < n)						// 再对每个单词单独反转
	{
		while (fast != n && s[fast] != ' ')
		{
			++fast;
		}
		
		reverse(&s[slow], &s[fast]);		// 此处用一般指针作为迭代器

		++fast;
		slow = fast;
	}

	return s;
}

注意:

reverse(&s[slow], &s[fast]);		// 此处用一般指针作为迭代器

此处用一般指针作为迭代器,传入的是地址,实际不会真的去取s[fast],因此当 fast == n 时不会导致溢出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值