一:杭电原题摘录http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=1§ionid=2&problemid=5
二.题目分析
首先他不是一个简单的字符串逆序,那样的话只用库函数就可以轻易解决,岂不便宜大家了.因为每一次的输入是由多个单词组成的字符串,中间由空格组成.这样逆序函数就不行了.
所以我们需要记录他的空格数,根据空格数m,将该字符分为m+1个单词,分别对m+1个单词进行reverse就可以了.但必须加上严谨逻辑的判断.
三.我的收获
1.首先肯定是getchar()的无穷魅力了.用来接收一个"\n" ,使输入输出标准化.
没有它的情况是这样的,建议亲手实践.(可以清楚看到有换行)
2.然后是库函数reverse(颠倒,相反),我叫它字符截取反转函数.
具体用法:比如.str="012345678",reverse(str+2,str+7)之后为23456,所以我理解为前闭后开
四.AC代码
#include <iostream>
using namespace std;
#include <cstdio>
#include <string>
#include <string.h>
#include <algorithm>
void change(char str1[100],int n)
{
int ji[100];
int i,i1,i2;
int m=i=i1=i2=0;
ji[0]=n;
//记录字符串a中各空格的位置
for(i=0;i<n;i++)
{
if(str1[i]==' '){
ji[m]=i;
m+=1;//空格数
}
}
//截取加反转函数
for(i=0;i<=m;i++)
{
if(i==0&&i==m) reverse(str1,str1+ji[0]);//m=首又=尾,也就是字符串只有一个单词
//接下来,单词数大于一.
if(i==0&&i!=m) reverse(str1,str1+ji[0]);//首
if(i==m&&i!=0) reverse(str1+ji[m-1]+1,str1+n);//尾
if(i>0&&i<m) reverse(str1+ji[i-1]+1,str1+ji[i]);//中
}
//输出
cout<<str1<<endl;
}
int main(int argc, char** argv)
{
int n;
int i;
cin>>n;
getchar();//用来接收一个"\n"
for(int j=0;j<n;j++)
{
char str[100];
gets(str);
i=strlen(str);
change(str,i);
}
return 0;
}
附:由于这是专栏的第一篇文章,特做出如下声明:以后的每一篇文章都会采用此写法和杭电的ACM题目.每天至少两篇免费注册账号http://acm.hdu.edu.cn/
ACM题型:
1.DIRECT(水题)
2.Computational Geometry(计算几何)
3.Number Theory(数论)
4.Search Techniques(搜索技术)
5.Dynamic Programming(动态规划)
6.Graph Theory(图论)
7.Data Structure(数据结构)
8.Other(其它)