现在的位置: 首页 > 综合 > 正文

面试100题系列之8单词反转 VS HDU1062——text reverse

2017年10月17日 ⁄ 综合 ⁄ 共 1645字 ⁄ 字号 评论关闭

给一个句子,将句子中的单词反转。
思路:先将句子整体反转,再将单词一个个进行反转。
*如果该字符是空格,前一个字符是单词,那么就在此处反转
*如果该字符是单词,其前一个字符是空格,则记录下单词开始的位置
特殊情况:句子后面是一串空格,输出的时候可能不想句子前面有空格,所以在反转之前需要先将空格滤去。

#include<stdio.h>
#include<string.h>

char a[100];

void Invert(char *buf, int Begin, int End)
{
	if(!buf || Begin > End)
		return;
	char ch;
	int i,j;
	for(i = Begin,j = End - 1; i < j; ++i,--j)
	{
		ch = buf[i];
		buf[i] = buf[j];
		buf[j] = ch;
	}
}
//找到每个单词在句子中的起始位置
void InvertWord(char *buf)
{
	if(!buf)
		return;
	bool IsWordBegin = false;
	int i;
	int start;
	int nLen = strlen(buf);	
	//过滤掉句子末尾的空格
	i = nLen - 1;
	while(i >= 0 && buf[i] == ' ')
		--i;
	buf[++i] = '\0';
	//整体反转
	Invert(buf, 0, i);

	for(i = 0; buf[i] != '\0'; ++i)
	{
		//字符后的第一个空格,反转单词
		if(buf[i] == ' ' && IsWordBegin)
		{
			Invert(buf, start, i);
			IsWordBegin = false;
		}
		//空格后的第一个单词,记录下标
		else if(buf[i] != ' ' && !IsWordBegin)
		{
			start = i;
			IsWordBegin = true;
		}
	}
	//反转最后一个单词,如果长度大于0,一定是以字符结尾
	if(i > 0)
		Invert(buf, start, i);
}
void main()
{
	while(gets(a))
	{
		InvertWord(a);
		puts(a);
	}
}

当然这个问题还可以扩展,比如说输入的white space(包括空格和换行符)滤去,单词与单词中间只保留一个空格。

参考另外一篇博客:http://blog.csdn.net/kay_zhyu/article/details/8694661
另外一种问题的变形:HDU 1062:http://acm.hdu.edu.cn/showproblem.php?pid=1062
其实两道题是一样的

#include<stdio.h>
#include<string.h>

void Invert(char *buf, int Begin, int End)
{
	if(!buf || Begin > End)
		return;
	char ch;
	int i,j;
	for(i = Begin,j = End - 1; i < j; ++i,--j)
	{
		ch = buf[i];
		buf[i] = buf[j];
		buf[j] = ch;
	}
}
//找到每个单词在句子中的起始位置
void InvertWord(char *buf)
{
	if(!buf)
		return;
	bool IsWordBegin = false;
	int i;
	int start;
	int nLen = strlen(buf);
	for(i = 0; i < nLen; ++i)
	{
		//字符后的第一个空格,反转单词
		if(buf[i] == ' ' && IsWordBegin)
		{
			Invert(buf, start, i);
			IsWordBegin = false;
		}
		//空格后的第一个单词,记录下标
		else if(buf[i] != ' ' && !IsWordBegin)
		{
			start = i;
			IsWordBegin = true;
		}
	}
	//如果长度大于0,反转最后一个单词
	if(i > 0 && IsWordBegin)
		Invert(buf, start, i);
}
void main()
{
	char a[1005];
	int n;
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		gets(a);
		InvertWord(a);
		puts(a);
	}
}

 

抱歉!评论已关闭.