压缩空格
压缩空格
Description
输入一行小写字母,将多个压缩为一个空格后输出。
Input
输入一行字符
Output
去掉多余的空格后输出,输出格式"%s\n"
Sample Input 1
asf as f
Sample Output 1
asf as f
问题来源:[CP1383 压缩空格(难度:中等)](https://www.ceaoj.club/problem/CP1338)
一、症结所在
我在分析这个问题时,想到了这样的方法:
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;
}
三、收获总结
1.别钻牛角尖
在最开始的想法时,我沿着那条路走了很久,才发现走不通。
但在找到正确的方法后,就会比较快。
不能只执着于一个想法,要有发散性思维。
2.补集的思想
“遇到连续空格的时候,跳过后面的空格就行了。即当该值不为空格或前一个值不为空格时,才赋值给数组2。”
前面这句话写起来可比后面这句话难度大多了。
利用补集的思想,能够更方便地写代码。