求数组中第一个无重复的元素

这题经典做法是:1)扫一遍数组,用一个map统计每个元素出现的次数,2)再扫一遍数组,返回第一个计数值为1的


只扫一次的算法:

1)扫一遍数组,用map计数,如果当前元素的计数值为1,加入到一个双向链表队尾,如果当前元素计数刚超过1,从链表中移除,map除了计数,还保存这个key在链表中的结点的地址。如果当前元素计数已经大于1,只累加计数,

2)链表头就是所求。



在C语言中,删除数组中指定重复第一个元素直接支持数组操作,因为数组一旦初始化,其大小和内容通常被认为是固定的。但是,你可以通过创建一个新数组并将非重复元素复制过来的方式来实现这个功能。下面是一个简单的示例: ```c #include <stdio.h> void remove_duplicates(int arr[], int n, int element_to_remove) { // 遍历数组,从第二个元素开始检查是否需要移除元素 for (int i = 1; i < n; i++) { if (arr[i] == element_to_remove) { // 如果找到该元素,从后续元素中逐个移动值到已删除的位置 for (int j = i; j > 0; j--) { arr[j] = arr[j - 1]; } // 减少数组长度,因为我们已经删除了一个元素 n--; // 退出内层循环,防止覆盖下一个元素 break; } } // 调整原数组的大小,多余的元素设置为0 arr[n] = 0; } int main() { int arr[] = {1, 2, 2, 3, 4, 4, 5}; int n = sizeof(arr) / sizeof(arr[0]); int element_to_remove = 2; remove_duplicates(arr, n, element_to_remove); printf("Modified array after removing the first occurrence of %d:\n", element_to_remove); for (int i = 0; i <= n; i++) { printf("%d ", arr[i]); // 注意这里n+1是因为后一个元素可能已被调整为0 } return 0; } ``` 这个程序会删除第一个出现的指定元素`element_to_remove`。然而,它并会改变原始数组的结构,而是返回一个新的数组。如果你想在原地修改数组,可能需要其他数据结构如链表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值