压缩空格

发布时间 2023-12-03 14:02:27作者: 20231420

压缩空格

问题
Description
输入一行小写字母,将多个压缩为一个空格后输出。

Input
输入一行字符

Output
去掉多余的空格后输出,输出格式"%s\n"

Sample Input 1 
asf    as    f

Sample Output 1
asf as f
问题来源:[CP1383压缩空格(难度:中等](https://www.ceaoj.club/problem/CP1383)

一、症结所在

我在分析这个问题时,想到了这样的方法:
1.用数组1存储输入的字符串;
2.将数组1赋值给数组2,其中遇到连续的空格,把后面的空格赋值过去时改为“空”。
3.输出数组2。
其中难点在于:“空”用什么实现。
我上午查询了该问题,询问了AI。
有说‘ 0’的,‘\0’的,‘NULL’的,但都不能实现。
于是我换了个想法,只有2有点改变:
2.将数组1赋值给数组2,其中遇到连续的空格,赋值为数组1中的下标+(已出现的空格数-单个的-首个的)。
虽然艰难地写出来了,但在运行时还是有问题:遇到很多个空格时,第一个空格会赋值,第二个是+1,还是空格……所以还是失败了。

二、解决方法

想是困难的,但想出来后就简单了。
解决方法其实很简单:
数组2并不需要和数组1等长。
换句话说,在最开始的想法上,遇到连续空格的时候,跳过后面的空格就行了。
即当该值不为空格或前一个值不为空格时,才赋值给数组2。

代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char str[100],ew[100];
    int i=0,j=0,l;
    gets(str);
    l=strlen(str);
    for(i=0; i<l; i++)
    {
        if(str[i]!=' '||str[i-1]!=' ')
        {
            ew[j]=str[i];
            j++;
        }
    }
    ew[j]='\0';
    printf("%s\n",ew);
    return 0;
}

关于这个“ew”数组,其实我本来写的是“new”,但是发现它变蓝了,保险起见,我就换了一下,图方便,就简单地去掉了“n”。

三、收获总结

1.别钻牛角尖

在最开始的想法时,我沿着那条路走了很久,才发现走不通。
但在找到正确的方法后,就会比较快。
不能只执着于一个想法,要有发散性思维

2.补集的思想

“遇到连续空格的时候,跳过后面的空格就行了。即当该值不为空格或前一个值不为空格时,才赋值给数组2。”
前面这句话写起来可比后面这句话难度大多了。
利用补集的思想,能够更方便地写代码。