将一句话进行倒置,标点不倒置。

作者:小 琛
欢迎转载,请标明出处

题目:
将一句话进行倒置,标点不倒置。例如:I like bejing. -> bejing. like I

分析:
这道题目和简单得倒置有所不同,并不是单纯得所有内容颠倒,而是要保持每个单词不变,仅仅将单词的次序倒置。

解题思路:将问题简单化,要完成该要求,可以先将所有的内容倒置,接着将每个单词再倒置,即可完成要求

#include <iostream>
#include <string>
//将一句话进行倒置,标点不倒置。例如:I like bejing.   ->   bejing. like I

//逆置函数,参数为两个指针,可将某区域内的内容逆置
void resever(std::string::iterator s1, std::string::iterator s2)
{
	while (s1 < s2)
	{
		std::swap(*s1, *s2);
		s1++;
		s2--;
	}
}
//主函数
void resever_str()
{
	std::string str;
	std::getline(std::cin, str);//从键盘获取一串字符,满足空格
	resever(str.begin(), str.end() - 1);//先总体逆置
	std::string::iterator head = str.begin();
	std::string::iterator tail = str.begin()+1;
	while (tail !=str.end())
	{
		while (*tail == ' ')//当tail碰到空格,表示遇到了一个单词,逆置该单词
		{
			resever(head, tail - 1);
			head = tail+1;
			tail++;
			continue;
		}
		tail++;
	}
	resever(head, tail - 1);//增加最后一个单词是没有逆置成功的,要额外加一次
	
	for (auto v : str)//范围for打印
	{
		std::cout << v;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值