ZOJ 1151 Word Reversal

题目大意:

         现有多个测例(测例数题中给出),每个测例中都会输入一篇文章,会给出文章的行数N(int型),然后给出文章中每行的内容,现要求把每行中的单词反转,其余不动,然后输出,输出时测例之间有空行,最后一个测例后没有空行。

题目链接

注释代码:

/*                        
 * Problem ID : ZOJ 1151 Word Reversal   
 * Author     : Lirx.t.Una                        
 * Language   : C             
 * Run Time   : 0 ms                        
 * Run Memory : 168 KB                        
*/

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

//表示当前指针是在一个单词内还是在一个单词外
#define	IN		1
#define	OUT		0

//经测试的每行最大长度
#define	MAXLEN		50

char	s[MAXLEN];//string,用于存储一行

void
srev( char *st, char *en ) {//string reverse,单词反转
	//分别为start和end指针
	
	char	ch;//临时变量
	
	while ( st < en ) {//交换
		
		ch    = *st;
		*st++ = *en;
		*en-- = ch;
	}
}

int
main() {
	
	int		t;//测例数
	int		n;//行数
	int		l;//一行的长度(即字符个数,包括空格等)
	
	int		st, en;//start和end指针
	
	int		flag;//标志,表示当前指针处于单词内还是单词外
	
	int		i;//扫描指针
	
	scanf("%d", &t);
	while ( t-- ) {
		
		scanf("%d\n", &n);
		while ( n-- ) {
			
			flag = OUT;//每行扫描开始都将指针设为在单词外
			gets(s);//获取一行
			l = strlen(s);
			
			for ( i = 0; i <= l; i++ ) {
				
				//之前指针在单词外,并且当前指针不指向空格或者字符串结尾标志
				if ( OUT == flag && s[i] != ' ' && s[i] ) {//则表示刚刚进入一个单词
					
					st   = i;//设定start
					flag = IN;//改变标记
					
					continue;
				}
				
				//表示指针仍然在当前单词内
				if ( IN == flag && s[i] != ' ' && s[i] )
					continue;
				
				//之前还在单词内的,但是当前指针指向空格或者字符串结尾标志
				if ( IN == flag && ( ' ' == s[i] || !s[i] ) ) {
					//这就表示刚刚退出一个单词
					
					en   = i - 1;//记录结尾
					flag = OUT;//该表标记
					srev( s + st, s + en );//并对筛选的单词进行翻转
					
					continue;
				}
			}
			
			puts(s);//打印一行
		}
		
		if (t) putchar('\n');//输出测例之间空一行,最后一个测例后没有空行
	}
	
	return 0;
}

无注释代码:

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

#define	IN		1
#define	OUT		0

#define	MAXLEN		50

char	s[MAXLEN];

void
srev( char *st, char *en ) {

	char	ch;

	while ( st < en ) {
	
		ch    = *st;
		*st++ = *en;
		*en-- = ch;
	}
}

int
main() {

	int		t;
	int		n;
	int		l;

	int		st, en;

	int		flag;

	int		i;

	scanf("%d", &t);
	while ( t-- ) {
	
		scanf("%d\n", &n);
		while ( n-- ) {
		
			flag = OUT;
			gets(s);
			l = strlen(s);

			for ( i = 0; i <= l; i++ ) {
			
				if ( OUT == flag && s[i] != ' ' && s[i] ) {
				
					st   = i;
					flag = IN;

					continue;
				}

				if ( IN == flag && s[i] != ' ' && s[i] )
					continue;

				if ( IN == flag && ( ' ' == s[i] || !s[i] ) ) {
				
					en   = i - 1;
					flag = OUT;
					srev( s + st, s + en );
					
					continue;
				}
			}
			
			puts(s);
		}
		
		if (t) putchar('\n');
	}
	
	return 0;
}

单词解释:

reversal:n, 逆转,反转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值