POJ 1951

把给定字符串翻译成目标字符串需要满足的条件是:

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 ;
}
View Code
原文地址:https://www.cnblogs.com/xiaohongmao/p/3400292.html