把给定字符串翻译成目标字符串需要满足的条件是:
1、开头不能有空格
2、末尾不能有空格
3、给定标点前不能有空格
4、不能有A、E、I、O、U
5、空格不能和空格相邻
6、相同的字母只能出现1次
给出一组测试数据('_'表示空格):
input
_I_AM_M._
output
M.
这道题是水题,但是我忽视了一点导致错误。
形如"_I_AM_M._"这个输入。
我开始的方法是从头扫空格,遇到字母就停下,这样I前的空格很容易就去掉了,但是像此种情况,I和A都是要去掉的字母,而I和A之间又有空格,这样的结果就是输出的M前会多一个空格,PE。避免这种错误的方法很简单,只要得要ans数组以后再扫就可以了,而不是直接扫输入的数组。在这种要去掉很多字母的情况下,最后处理空格最稳妥。这题的错误一方面是因为我托大的心态,另一方面是经验不足,以后要吸取教训。
#include <iostream> using namespace std ; int main() { char str[101],ans[101] ; int num[101] ; int top ; while(gets(str)) { if(str[0]==EOF) break ; int len=strlen(str) ; top=0 ; int f=1 ;//判断多个空格不能相邻的标志 memset(num,0,sizeof(num)) ; for(int i=0;i<len;i++) { if(str[i]==' ' && f) { ans[top++]=' ' ; f=0 ; continue ; } else if(str[i]==' ') continue ; if(str[i]=='A' || str[i]=='E' || str[i]=='I' || str[i]=='O' || str[i]=='U')//跳过的字母 { continue ; } if(str[i]=='.' || str[i]==',' || str[i]=='?')//打印标点 { ans[top++]=str[i] ; f=1 ; continue ; } if(num[str[i]]==0)//打印字母 { ans[top++]=str[i] ; num[str[i]]=1 ; f=1 ; continue ; } } //printf("%d %s",top,ans) ; while(ans[top-1]==' ')//末尾不能是空格 top-- ; int cnt ; for(int i=0;i<top;i++)//输出前面不能有空格 if(ans[i]!=' ') { cnt=i ; break ; } for(int i=cnt;i<top;i++) { if(ans[i]==' ' && (ans[i+1]=='.' || ans[i+1]==',' || ans[i+1]=='?'))//去掉标点前的空格 continue ; else printf("%c",ans[i]) ; } putchar(' ') ; } return 0 ; }