好题分享
用C语言实现:去掉给定字符串中重复的字符
比较笨拙的写法:从首字符开始逐一判断是否出现相同的字符。如果出现相同的字符,标记该相同字符的位置,然后字符串从后往前移动覆盖原来相同字符。
注意:如果给定字符串中出现连续三个及以上的相同字符,则每次覆盖了相同字符之后tmp指向的位置要往前移动一位,继续执行循环覆盖相同字符。
#include <stdio.h>
int main(void)
{
char str[] = {"googlegoogleggg"};
int i = 0;
char *tmp = str;
while (*tmp)
{
i = 1;
while (*(tmp + i))
{
if (*tmp == *(tmp + i))
{
// 从后往前覆盖字符串
while (*(i + tmp))
{
*(tmp + i) = *(tmp + i + 1);
i++;
}
// 如果出现三个及三个以上的连续的相同字符,
// 每次覆盖了重复字符之后,tmp指向的位置必须往前移动一位
tmp--;
break;
}
i++;
}
tmp++;
}
puts(str);
return 0;
}
高效写法:
原理:在ASCII码表中,总共有128个字符,ASCII码值为0~ 127。因此,可以用一个数组的下标来记录给定的字符串中尚未重复出现的字符的ASCII码值:若字符是第一次出现,则对应下标的数组元素置为1,并存储该字符。
#include <stdio.h>
int main(void)
{
char string[] = {"googlegooooole"};
// 用于记录字符串中的字符是否重复出现
char check[128] = {0};
// 用于记录字符的数组下标
int label = 0;
char *str_pos = string;
while (*str_pos)
{
if (0 == check[*str_pos]) // 判断是否重复出现过
{
// 置1表示该字符已重复出现
*(check + *str_pos) = 1;
// 将尚未重复出现的字符存储到字符串string中
*(string + label) = *str_pos;
label++;// 索引加1,指向下一个需要存储字符的位置
}
str_pos++;
}
// 跳出循环则表示已无重复字符,但是空终止字符没有存储
*(string + label) = '\0';
puts(string);
return 0;
}