单词翻转(题解与分析)

总时间限制:

1000ms

内存限制:

65536kB

描述

输入一个句子(一行),将句子中的每一个单词翻转后输出。

输入

只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。

输出

翻转每一个单词后的字符串,单词之间的空格需与原文一致。

样例输入

hello world

样例输出

olleh dlrow

分析:

首先我们要翻转每个单词,我们是否可以不用一直想着怎么将每个单词翻转然后再将翻转完单词的整个字符串输出来,我们可以直接以将每个单词的起点和终点找到,然后将每个单词反向遍历输出(当然,空格位置不变)的思路来写,这样写步骤更为简单些。

关键思路:

1.我们可以记录每个单词的长度,以空格为标志记录每个单词的末尾,这样就可以找到每个单词的起点和终点。

2.我们以直接输出的方式来完成,无需改变原来的字符串,这样单词长度以及单词末尾这两个变量就不需要再用数组来记录,两个变量重复利用即可。

注意点:

1.我们需要仔细思考一下这个遍历单词的for循环中 j 的取值范围,否则很容易造成错位。

2.我们需要注意最后一个单词后面是没有空格的,这个字符串在字符数组中在最后是一个字符'\0',而我们以空格为标志来记录单词末尾位置,所以我们采取把'\0'变成字符空格的方式解决最后一个单词。

3.如果我们用 x 来记录每个单词的长度,那么当一个单词输出之后我们需要把 x 归0,防止下一个单词的长度与上一个单词的长度叠加。

下面是AC代码:

#include <stdio.h>
#include <string.h>
int main(){
	char a[505];
	gets(a);
	int x=0;
	int len=strlen(a);
	a[len]=' ';//把最后一个单词后面的'\0'改为空格 
	for(int i = 0;i<=len;i++){//i要有等于len的时候 
		if(a[i]==' '){
			for(int j = i-1;j>=i-x;j--){//反向遍历输出单词 
				printf("%c",a[j]);
			}
			if(i!=len){//最后一个单词后面不用输出空格 
				printf(" ");
			}
			x=0;//归0 
		}
		else{
				x++; 
		}
	}
	return 0;
}

以上代码不需要真正翻转单词,下面我再给出翻转单词后再一起输出的源代码:

#include <stdio.h>
#include <string.h> 
#include <stdlib.h>
int main(){
	char a[505];
	gets(a);
	int k = 0,x,tmp;
	int len=strlen(a);
	a[len]=' ';
	int m,n;
	for(int i = 0;i<=len;i++){
		if(a[i]==' '){
			x=i-1;
			for(m = x,n = i-k;;m--,n++){
				if(n>=m){
					break;
				}			
				tmp=a[m];
				a[m]=a[n];
				a[n]=tmp;
			}
			k=0;
		}
		else{
			k++;
		}
	}
   	for(int i = 0;i<len;i++){
   		printf("%c",a[i]);
   	}
	return 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值