C 语言:高效删除重复数字输出119


在编程中,经常会遇到需要对数据进行去重处理的情况,即删除重复出现的元素。针对不同的场景,可以使用不同的数据结构和算法来实现去重。本文将重点讨论如何在 C 语言中使用高效的方法删除数组中的重复数字,并输出去重后的结果。

基本思路

删除重复数字的基本思路是,遍历数组,并逐个检查每个元素是否在前面已经出现过。如果已经出现,则将其标记为需要删除,否则继续遍历。遍历完成后,输出标记为保留的元素即可。

使用数组标记

一种简单的实现方法是使用一个辅助数组来标记每个元素的保留状态。辅助数组的长度与原数组相同,并使用布尔类型的值(如 0 和 1)来表示元素是否需要删除。遍历原数组时,如果发现一个元素已经在辅助数组中被标记为需要删除,则跳过该元素;否则,将其标记为保留。

代码示例:```c
#include
int main() {
int arr[] = {1, 2, 3, 4, 5, 1, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
int deleted[n];
for (int i = 0; i < n; i++) {
deleted[i] = 0;
}
for (int i = 0; i < n; i++) {
if (deleted[i] == 1) {
continue;
}
for (int j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
deleted[j] = 1;
}
}
}
for (int i = 0; i < n; i++) {
if (deleted[i] == 0) {
printf("%d ", arr[i]);
}
}
return 0;
}
```

使用哈希表

哈希表是一种更有效的数据结构,可以用来快速查找和插入元素。在删除重复数字的情况下,可以使用哈希表来检查元素是否已经存在。如果存在,则将其标记为需要删除;否则,将其加入哈希表并标记为保留。

代码示例:```c
#include
#include
typedef struct node {
int data;
struct node *next;
} node_t;
int main() {
int arr[] = {1, 2, 3, 4, 5, 1, 2, 3};
int n = sizeof(arr) / sizeof(arr[0]);
node_t *hash_table[n];
for (int i = 0; i < n; i++) {
hash_table[i] = NULL;
}
for (int i = 0; i < n; i++) {
node_t *new_node = (node_t *)malloc(sizeof(node_t));
new_node->data = arr[i];
new_node->next = NULL;
int index = arr[i] % n;
if (hash_table[index] == NULL) {
hash_table[index] = new_node;
} else {
node_t *temp = hash_table[index];
while (temp != NULL) {
if (temp->data == arr[i]) {
new_node->next = temp->next;
temp->next = new_node;
break;
}
temp = temp->next;
}
}
}
for (int i = 0; i < n; i++) {
node_t *temp = hash_table[i];
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
}
return 0;
}
```

性能比较

使用数组标记和哈希表这两种方法在时间复杂度上存在差异。数组标记方法的时间复杂度为 O(n^2),其中 n 为数组的长度,因为需要遍历数组两次。哈希表方法的时间复杂度为 O(n),因为哈希表的查找和插入操作都是恒定的时间复杂度。因此,当数组较大时,哈希表方法将明显优于数组标记方法。

结语

本文讨论了两种在 C 语言中高效删除重复数字的方法:使用数组标记和使用哈希表。根据数组的大小和具体应用场景,可以选择最合适的算法。希望本文能够为需要解决此类问题的开发者提供帮助。

2024-11-23


上一篇:C 语言 open 函数:全面指南

下一篇:探究 C 语言中的结构体输出