一、问题描述
输入一个字符串,注意是可以带空格的,我们所要做的是如果字符之间有很多个连续的空格,我们只需要保留一个空格,并输出显示。
有一个类似的问题,是将一个数中连续相同的数删除掉,只保留其中一个数,如3456667,转化为34567。这个问题与字符串的问题大体上是一致的,
只是字符串限定了只有连续的空格需要处理,连续的其他字符是可以接受的,如abbbc是满足条件的,而a bbb ccc则要转换为a bbb ccc.
二、问题分析
在书写程序的过程中,首先的思路是以空间换取时间,使得该问题的时间复杂度为线性复杂度O(n)。
先用一个字符数组b存取字符串a的第一个元素,然后依次比较b中的最后一个元素与a中的下一个元素。
如果两者不同,很明显把a中的这个元素加入b数组;
如果两者相同,但是不是空格,则也满足条件,把a中的这个元素加入数组;
其余的条件就是两者相同,但是都是空格,为了避免出现连续的空格,所以不加入这个元素;
下面将举个简单的例子:字符串1 :ab cd edd;数组2第一个元素设为字符串1的第一个元素a;
开始比较字符串下一个元素b和数组2最后一个元素a,发现满足,即数组2变成ab;接着比较字符串的空格与数组2的最后一个元素b,发现不相等,继续加入;
数组2变成ab .然后发现字符串的下一个元素还是空格,与数组2的最后一个元素是相同的,舍弃;依次类推,我们便可以得到ab cd edd这个结果。
如果是要删除数中连续相同的数,保留一个,那么做法类似,甚至更简单,直接比较是否相等,相等舍弃,不等加入。
三、程序设计
(1)字符串删除连续空格,保留一个空格的程序:
其中需要注意的是getline函数,之前无脑直接采用cin,忽略了cin是以空格为结束符,所以根本读取不了,直接在输入就错误了;
getline则可以实现输入含有空格的各种字符串;
(2)删除数中连续相同的数,保留一个数
四、程序结果
(1)
(2)
综上,在学习中要多思考类似的问题,可以达到比较好的效果,学习效率也会提高!