c语言删除重复的字母不保留,[C/C++]如何去除重复出现的字符,而且保持原序列的相对位置不变...

这天,在bat群里面有个哥们提出一个问题:

//string str =

"zhaohaoyang";

//如何去除重复出现的字符,而且保持原序列的相对位置不变,例如这个例子会变成zyng

当时首先想到的,脑袋中出现得竟然是map容器,因为它不会存储重复的key值,于是,我写起下面这段代码:

mapvector

> char_repeator;

intinput;

intnumber

= 0;

while(EOF!=

(input = getchar())){

char_repeator[input].push_back(++number);

}

for(mapvector

>::const_iterator iter = char_repeator.begin(); iter!=

char_repeator.end(); ++iter){

if(1==

iter->second.size())

cout<<

iter->first;

}

cout

<< endl;

输出结果:

992598fb8931fe528ab9b244aced3d9e.png

我们想得到的结果是eca,没想到最后却是ace,这是因为map会自动对key排序。

此路不通,寻问别人。

甘哥说,可以用unique,于是我上网找了一篇文章,了解了一下,开干,写了下面这段代码:

string

str = "zhaohaoyang";

vector

vecch(str.begin(), str.end());

//根据迭代器的起始位置和终止位置来定初始化一个容器

vector::iterator

it = vecch.begin();

for

(; it != vecch.end(); ++it)

{

cout<

}

cout

<< endl;

sort(str.begin(),str.end());

cout<< str

<

str.erase(unique(str.begin(),

str.end()), str.end());

cout

<< str <

输出结果:

17f1de34097075423e41c0857d7a42c2.png

结果依然不理想,和map的结果类似,unique只对相邻且重复的字符去重得唯一,但不能对不相邻的去重得唯一,

故还是不行。

此路不通,再次寻问别人。

晓卫说,可以创建三个数组来记录,用数组模拟散列,我一听晕了,真得能做到吗?怀着半信半疑的态度把代码写完,发现:

charorgin[]

= {"zhaohaoyang"};//应该输出zyng

chartemp[128];//按序暂存字符

chardest[128];//存放结果

intcountor[128]

= {0};//统计字符个数

intlength

= strlen(orgin);

memset(temp,'\0',

sizeof(dest));

memset(dest,'\0',

sizeof(dest));

intj

= 0;

for(inti

= 0; i != length; ++i){

if(1

== ++countor[orgin[i]])

temp[j++]=

orgin[i];

}

j=

0;

for(inti

= 0; temp[i] != '\0'; ++i)

if(1==

countor[temp[i]])

dest[j++]=

temp[i];

printf("\n%s\n",orgin);

printf("%s\n",

dest);

输出结果:

6b5543e551d98f1e285edc87e1737d19.png

发现真得成功了。主要是需要一个数组来存放字符的顺序,然后取出现次数为1的字母加进目标数组就行了。

后来想想,因为我们的目的是去重,所以一共128个可输入字符(可见字符其实是93个),每个字符至多出现一次,所以我们得到的最后字符串并不繁琐,反而很简单,从我们创建的字符数组的大小是128就可以得知,得到的最后字符串的大小最多是128。

自己转了一个大弯子,本来用C语言老老实实写的程序,非得用C++,这,你说能不郁闷吗?

在bat群里的一哥们也提出一种方案,用vbs的len(replace(str,”z”,””))依次替换每一个字符后计算长度来判断是否重复,

这个方法理论上是可以的,只不过效率可能略低,因为要依次替换,还要计算长度。但是也是一种思路,多动脑毕竟是好事。

所以,思路还需灵活,思路决定出路,我还需要多多学习,最后,感谢各位兄弟的帮忙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值