程序设计-----字符串中删除连续空格,只保留一个空格 数中删除连续相同的数,只保留一个数

一、问题描述

输入一个字符串,注意是可以带空格的,我们所要做的是如果字符之间有很多个连续的空格,我们只需要保留一个空格,并输出显示。

有一个类似的问题,是将一个数中连续相同的数删除掉,只保留其中一个数,如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)

 

五、利用C++现成的算法库实现

(1)字符串删除连续空格,保留一个空格的程序:

 

(2)删除数中连续相同的数,保留一个数:

只需将unique中的第三个参数删除掉就可以,不适用二元谓词函数

 

这是这样做会使程序大大的缩短,但是本质都是一样的。

综上,在学习中要多思考类似的问题,可以达到比较好的效果,学习效率也会提高!

posted @ 2015-05-05 21:43  cxm_hy  阅读(6665)  评论(4编辑  收藏  举报