首页 > 解决方案 > 如何在不重复的数组中插入元素?

问题描述

我想用c编写一个高效的程序,读取文件中的元素并将其放入数组中。我的想法是有一个函数来查找数组中是否存在的每个元素,但是它花费的时间太长而且每个文件都有数百万个元素(重复)。您是否知道如何在不重复的情况下将这些元素插入到数组中?

注意:这些元素是 10 位数字,包含被占用位置的矩阵不是一个选项

标签: c

解决方案


如果您只想存储一次所有元素,则可以使用STL 设置(下面还给出c++了这样做的示例)。c它存储一个值不超过一次。您可以像这样声明一个集合

set<int>sett;

集合中插入一个值

sett.insert(6);

打印集合中的所有值:

for(auto a: sett){
    cout<<a<<endl;
}

您可以访问geekforgeekcplusplus网站了解更多信息。

如果你想跟踪一个数字是否在数组中,你可以像这样有效地做到这一点:

取一个Boolean ArrayMap并将其全部设为 initial value false。从文件中扫描后,如果数字为 N,则创建 Boolean Array 或 Map 的第 N 个索引true

现在,如果您想检查数字 M 是否在数组中。您可以通过检查布尔数组或 Map 的第 M 个索引是否true仅在 O(1) 时间内轻松获得此信息。

请参见下面的示例,这是使用Boolean array完成的。如果布尔数组的大小太大,请记住全局清除布尔数组。您也可以c++. 如需了解有关SLT MAP的更多信息,请访问cpluspluscppreferencegeeksforgeeks

#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;
    }
}

推荐阅读