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