去掉重复字符(C语言)

本文介绍了一种使用C语言实现的高效数组字符去重方法,通过先排序再遍历的方式达到O(n)的时间复杂度。文章附带了具体实现代码,并建议读者手动跟踪理解。

利用c语言实现消除数组中重复的字符,很多人都能实现,但复杂度太大O(n^2),也有利用空间换时间的,但都不太理想。现在我来介绍一种可行的方法。什么都不说先上代码。


运行程序为


这个思想其实很简单,但前提是先排好序。时间复杂度为O(n)。

如果你还看不懂,那就拿起笔照着程序走一遍你就明白了。我也是这样懂的


### 如何用 C 语言编写程序去除字符串中的重复字符 要去除字符串中的重复字符,可以采用多种方法来实现。以下是基于引用内容以及专业知识的一种解决方案。 #### 方法描述 通过遍历输入字符串并利用辅助数据结构记录已访问过的字符状态,从而构建一个新的无重复字符字符串。这种方法的时间复杂度接近 O(n),其中 n 是字符串长度。 #### 实现代码示例 以下是一个完整的 C 程序,用于移除字符串中的重复字符: ```c #include <stdio.h> #include <string.h> // 函数声明 void remove_duplicates(char* str); int main() { char input_str[100]; printf("请输入一个字符串: "); fgets(input_str, sizeof(input_str), stdin); // 移除可能存在的换行符 size_t len = strlen(input_str); if (len > 0 && input_str[len - 1] == '\n') { input_str[len - 1] = '\0'; } // 调用函数去重 remove_duplicates(input_str); // 输出结果 printf("处理后的字符串为:%s\n", input_str); return 0; } // 定义函数:移除字符串中的重复字符 void remove_duplicates(char* str) { int seen[256] = {0}; // ASCII 字符集大小为 256 char* write_ptr = str; for (char* read_ptr = str; *read_ptr != '\0'; ++read_ptr) { unsigned char c = *read_ptr; if (!seen[c]) { // 如果该字符未被标记过 seen[c] = 1; // 标记此字符已经出现 *write_ptr++ = c; // 将当前字符写入目标位置,并移动指针 } } *write_ptr = '\0'; // 添加字符串结束标志 } ``` #### 关键点解析 上述代码的核心逻辑在于维护了一个 `seen` 数组,其索引对应于字符ASCII 编码值。每当遇到新字符时,将其存储到目标字符串中;如果再次遇到相同的字符,则跳过不处理[^1]。 对于更复杂的场景(如连续多个相同字符),可以通过调整读取和写入指针的方式进一步优化算法行为[^2]。 另外,在某些情况下还可以引入栈的思想来解决类似问题,比如当需要保留最后一次出现而非第一次的情况时[^3]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memory_cood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值