c语言如何去除数组中重复的数

c语言如何去除数组中重复的数

在C语言中去除数组中的重复数,可以通过以下几种方法:使用双重循环、排序后去重、使用哈希表。下面将详细介绍其中一种方法:使用双重循环。

使用双重循环是最基础的方法,通过遍历数组的每一个元素,并将其与后面的所有元素进行比较,如果发现重复的元素,就将其删除。尽管这种方法效率相对较低,但对于理解去重的原理非常有帮助。

一、双重循环去重法

1、基本原理

双重循环去重法的基本原理是:使用两个嵌套的循环,第一个循环遍历每一个元素,第二个循环则检查该元素是否在后续元素中重复出现。如果发现重复的元素,就将其删除,并将数组的长度减1。

2、代码实现

下面是一个使用双重循环去除数组中重复元素的C语言代码示例:

#include <stdio.h>

// 函数声明

void removeDuplicates(int arr[], int* n);

int main() {

int arr[] = {1, 2, 2, 3, 4, 4, 5};

int n = sizeof(arr) / sizeof(arr[0]);

removeDuplicates(arr, &n);

printf("Array after removing duplicates: ");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

return 0;

}

void removeDuplicates(int arr[], int* n) {

for (int i = 0; i < *n; i++) {

for (int j = i + 1; j < *n; ) {

if (arr[i] == arr[j]) {

for (int k = j; k < *n - 1; k++) {

arr[k] = arr[k + 1];

}

(*n)--;

} else {

j++;

}

}

}

}

在上述代码中,removeDuplicates函数接受一个数组和数组长度的指针。外层循环遍历每个元素,内层循环从当前元素的下一个位置开始,检查是否存在重复元素。如果发现重复元素,则通过移动数组元素覆盖重复项,并减少数组长度。

二、排序后去重法

1、基本原理

排序后去重法的基本原理是:首先对数组进行排序,然后在遍历数组时,只需比较相邻的元素是否相等即可。这种方法的效率较高,尤其适用于较大的数据集。

2、代码实现

下面是一个使用排序后去除数组中重复元素的C语言代码示例:

#include <stdio.h>

#include <stdlib.h>

// 函数声明

void removeDuplicates(int arr[], int* n);

int compare(const void* a, const void* b);

int main() {

int arr[] = {1, 2, 2, 3, 4, 4, 5};

int n = sizeof(arr) / sizeof(arr[0]);

removeDuplicates(arr, &n);

printf("Array after removing duplicates: ");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

return 0;

}

void removeDuplicates(int arr[], int* n) {

// 首先对数组进行排序

qsort(arr, *n, sizeof(int), compare);

int j = 0;

for (int i = 0; i < *n - 1; i++) {

if (arr[i] != arr[i + 1]) {

arr[j++] = arr[i];

}

}

arr[j++] = arr[*n - 1];

*n = j;

}

int compare(const void* a, const void* b) {

return (*(int*)a - *(int*)b);

}

在上述代码中,removeDuplicates函数首先使用qsort函数对数组进行排序,然后通过比较相邻元素来去除重复的元素。

三、使用哈希表去重法

1、基本原理

使用哈希表去重法的基本原理是:利用哈希表的快速查找特性,将数组中的元素依次插入哈希表,同时检查是否已经存在于哈希表中。如果存在,则表示该元素是重复的。

2、代码实现

由于C语言本身并没有内置的哈希表实现,我们可以使用标准模板库(STL)中的哈希表实现,或者自己编写一个简单的哈希表。下面是一个使用哈希表去除数组中重复元素的C语言代码示例:

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

// 定义哈希表的大小

#define TABLE_SIZE 100

// 哈希表节点结构

typedef struct Node {

int data;

struct Node* next;

} Node;

// 哈希表

Node* hashTable[TABLE_SIZE];

// 函数声明

void initHashTable();

int hashFunction(int key);

bool insert(int key);

void removeDuplicates(int arr[], int* n);

int main() {

int arr[] = {1, 2, 2, 3, 4, 4, 5};

int n = sizeof(arr) / sizeof(arr[0]);

removeDuplicates(arr, &n);

printf("Array after removing duplicates: ");

for (int i = 0; i < n; i++) {

printf("%d ", arr[i]);

}

return 0;

}

void initHashTable() {

for (int i = 0; i < TABLE_SIZE; i++) {

hashTable[i] = NULL;

}

}

int hashFunction(int key) {

return key % TABLE_SIZE;

}

bool insert(int key) {

int index = hashFunction(key);

Node* newNode = (Node*)malloc(sizeof(Node));

newNode->data = key;

newNode->next = hashTable[index];

hashTable[index] = newNode;

return true;

}

bool search(int key) {

int index = hashFunction(key);

Node* temp = hashTable[index];

while (temp != NULL) {

if (temp->data == key) {

return true;

}

temp = temp->next;

}

return false;

}

void removeDuplicates(int arr[], int* n) {

initHashTable();

int j = 0;

for (int i = 0; i < *n; i++) {

if (!search(arr[i])) {

insert(arr[i]);

arr[j++] = arr[i];

}

}

*n = j;

}

在上述代码中,removeDuplicates函数使用哈希表来检查并去除数组中的重复元素。通过自定义的哈希函数和链表来实现哈希表的插入和查找操作。

四、总结

在C语言中去除数组中的重复元素可以采用多种方法,包括双重循环、排序后去重和使用哈希表。双重循环方法简单直观,但效率较低排序后去重方法效率较高,适用于较大的数据集使用哈希表方法利用了哈希表的快速查找特性,效率也很高

不同的方法适用于不同的场景,开发者可以根据具体需求选择合适的方法进行实现。对于实际项目中,推荐使用研发项目管理系统PingCode通用项目管理软件Worktile来管理和跟踪代码的变化,以提高开发效率和代码质量。

相关问答FAQs:

1. 如何判断一个数组中是否存在重复的数?

要判断一个数组中是否存在重复的数,可以通过遍历数组并使用一个哈希表来记录每个数字出现的次数。如果在遍历过程中发现某个数字已经在哈希表中出现过,则说明数组中存在重复的数。

2. 如何去除一个数组中的重复数?

要去除一个数组中的重复数,可以使用两个指针来遍历数组。一个指针指向当前处理的位置,另一个指针用来记录已经处理过的不重复的数。当遇到一个新的不重复的数时,将其放到指针所指的位置,并将指针向后移动一位。

3. 如何保留数组中重复数的最后一个出现位置?

如果想保留数组中重复数的最后一个出现位置,可以使用一个哈希表来记录每个数字出现的最后一次位置。在遍历数组时,如果遇到一个重复的数字,更新它在哈希表中的位置值。最后,遍历哈希表,将数组中对应位置的数保留下来即可。

原创文章,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/1183563

(0)
Edit2Edit2
上一篇 2024年8月30日 下午7:15
下一篇 2024年8月30日 下午7:15
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部