我正在尝试在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。此外,无论如何我是否可以为此编写更有效的代码?我只是借用了别人的代码...
答案 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的返回值将包含所有重复数字的向量