检查数组中的重复数字

时间:2014-08-06 01:51:02

标签: c++ arrays

该功能应该检查是否有重复的号码,但它不能以某种方式工作。

谁知道为什么?

#include <iostream>

using namespace std;


int main()
{
   int const size = 10;
   int arry[size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};

   int i = 0;
   int k = 1;

   for (i = 0; i < size; i++)
   {
       for (k = 1; k < size; k++)
       {
           if (arry[i] == arry[k])
           {
               cout << arry[i] << " " << arry[k] << endl;
               cout << "duplicate" << endl;
               return 0;
           }
       }
   }
   cout << "no duplicate" << endl;
   return 0;
}

3 个答案:

答案 0 :(得分:3)

您应该在i == k时跳过。

for (i = 0; i < size; i++)
{
   for (k = i+1; k < size; k++) // <-- either change HERE
   {
       if (i != k && arry[i] == arry[k])
       //  ^^^^^^ or HERE
       {
           cout << arry[i] << " " << arry[k] << endl;
           cout << "duplicate" << endl;
           return 0;
       }
   }
}

答案 1 :(得分:0)

您每次检查每个组合两次 - 例如,您将元素2与元素5进行比较,然后将5与2进行比较。除了您还要检查元素本身的事实(这是蒂姆拉的答案正在防范),你两次做同样的工作。

所以试试

for (i = 0; i < size; i++)
{
     for (k = i + 1; k < size; k++)

代替。

你的方法仍然不能很好地扩展,它基本上是O(n ^ 2)。对数组进行排序然后寻找重复的邻居会更快。

答案 2 :(得分:0)

更有效的方法应该是首先对数组进行排序:

std::vector<int> a = {4, 3, 2, 1, 2, 5, 6};

std::sort(std::begin(a), std::end(a));
for (std::size_t i = 1; i < a.size(); ++i) {
    if (a[i - 1] == a[i]) {
        std::cout << a[i] << " " << a[i] << std::endl;
        std::cout << "duplicate" << std::endl;
        return 0;
    }
}
return 0;