c - 如何在不重复的数组中插入元素?
问题描述
我想用c编写一个高效的程序,读取文件中的元素并将其放入数组中。我的想法是有一个函数来查找数组中是否存在的每个元素,但是它花费的时间太长而且每个文件都有数百万个元素(重复)。您是否知道如何在不重复的情况下将这些元素插入到数组中?
注意:这些元素是 10 位数字,包含被占用位置的矩阵不是一个选项
解决方案
如果您只想存储一次所有元素,则可以使用STL 设置(下面还给出c++
了这样做的示例)。c
它存储一个值不超过一次。您可以像这样声明一个集合:
set<int>sett;
在集合中插入一个值
sett.insert(6);
打印集合中的所有值:
for(auto a: sett){
cout<<a<<endl;
}
您可以访问geekforgeek和cplusplus网站了解更多信息。
如果你想跟踪一个数字是否在数组中,你可以像这样有效地做到这一点:
取一个Boolean Array或Map并将其全部设为 initial value false
。从文件中扫描后,如果数字为 N,则创建 Boolean Array 或 Map 的第 N 个索引true
。
现在,如果您想检查数字 M 是否在数组中。您可以通过检查布尔数组或 Map 的第 M 个索引是否true
仅在 O(1) 时间内轻松获得此信息。
请参见下面的示例,这是使用Boolean array完成的。如果布尔数组的大小太大,请记住全局清除布尔数组。您也可以在c++
. 如需了解有关SLT MAP的更多信息,请访问cplusplus、cppreference、geeksforgeeks。
#include <stdio.h>
#include <stdbool.h>
bool mapp[999999999] = {false};
int main()
{
int i, n, t, m, ara[1000];
printf("Input the size of array: ");
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &ara[i]);
mapp[ara[i]] = true;
}
printf("Input number of time you want to check a number in array or not: ");
scanf("%d", &t);
while(t--){
scanf("%d", &m);
if(mapp[m] == true)
printf("Number Exists\n");
else
printf("Number Not Exists\n");
}
}
您也可以使用此技巧在数组中不包含重复值。为此,如果输入的数字是“a”。检查是否mapp[a]
已标记为true
。仅在数组中包含 'a' 且仅是 if mapp[a] != ture
。这个小改动将从您的数组中排除所有重复值。
scanf("%d", &n);
j = 0;
for(i = 0; i < n; i++){
scanf("%d", &a);
if(mapp[a] != true){
mapp[a] = true;
ara[j++] = a;
}
}
推荐阅读
- c++ - C++ - 对象填充错综复杂
- swift - SwiftUI - 两次触发断点
- python - 检测图像中最长的水平和垂直线
- c# - 现代 OpenGL - 属性可以在着色器中设置条件吗?
- javascript - 状态不会传递给子组件
- hashset - HashSet 不以相同的方式存储相等的 Integer 和 Double 值
- ios - 备份和恢复 Realm 文件 iOS
- react-router - 测试时无法使用 MemoryRouter 导航到路径
- javascript - 基于起点和终点的 JSON 数组排序
- apache - 将 htacess 从 https://example.com/folder/ 重写为 https://example.com/