如何检查数组中是否没有值

时间:2019-11-17 02:26:49

标签: c++ arrays function

我正在尝试在int arr []中为3位数字创建一个随机数,并检查其值。要检查的值是数组是否具有double,例如ex。 (5,5,3),则将得到非重复的ex。(3)。我使用了printRepeating来查看数组中是否有重复的数字,如果存在,它将调用firstNonRepeating函数来获得非重复的数字。问题出在printRepeating中,我如何检查arr [i]是否为空,所以它将调用firstNonRepeating函数是否不为空,因为即使它为空(数组没有重复的数字),它仍然会调用firstNonRepeating ()。

int firstNonRepeating(int arr[], int size)  
{ 
    cout << "\nvalue of roll is ";
    for (int x = 0; x < size; x++) { 
        int e; 
        for (e = 0; e < size; e++) 
            if (x != e && arr[x] == arr[e]) 
                break; 
        if (e == size) 
            return arr[x]; 
    } 
    return -1; 
} 

int printRepeating(int arr[], int size)
{ 
    int i, j; 
    printf(" Repeating elements are "); 
    for(i = 0; i < size; i++) 
        for(j = i + 1; j < size; j++) 
        if(arr[i] == arr[j]) 
            cout << arr[i] << " ";
    if(arr[i] != 0)
    {
        cout << firstNonRepeating(arr, size); 
    }
}  


int main() 
{ 
    int arr[] = {5, 3, 5}; 
    int arr_size = sizeof(arr)/sizeof(arr[0]);  
    printRepeating(arr, arr_size); 
}

p.s。此外,无论如何我是否可以为此编写更有效的代码?我只是借用了别人的代码...

1 个答案:

答案 0 :(得分:0)

对于您的特定用例,嵌套循环将每个元素与其他每个元素进行匹配,并检查是否有重复,这没什么不对。在具有更多数字的示例中,可以根据您的约束条件确定这种方法的多种方式。最简单的方法是创建一个std::unordered_set<int>并遍历数组,检查当前数字是否在unordered_set中,如果不是,则将该数字添加到集合中并继续。 示例代码看起来像

#include <unordered_set>
#include <iostream>
#include <vector>

using namespace std;

vector<int> getRepeating(int arr[], int size)
{
    vector<int> rv;
    unordered_set<int> curr_set;
    for(int i = 0; i < size; ++i){
        if(curr_set.find(arr[i]) != curr_set.end())
             rv.push_back(arr[i]);
        curr_set.insert(arr[i]);
    }
    return rv;
}

int main()
{
    int arr[] = {5, 3, 5};
    int arr_size = sizeof(arr) / sizeof(arr[0]);
    vector<int> repeating = getRepeating(arr, arr_size);
    if(repeating.size() == 0)
        cout << "no repetition found" << endl;
    else{
        for(int i = 0; i < repeating.size(); ++i)
            cout << i << "th repeating: " << repeating[i] << endl;
    }
}

其中getRepeating的返回值将包含所有重复数字的向量