更优雅的方法来检查 C 数组中的重复项?

新手上路,请多包涵

我在 C++ 中编写了这段代码,作为 uni 任务的一部分,我需要确保数组中没有重复项:

 // Check for duplicate numbers in user inputted data
    int i; // Need to declare i here so that it can be accessed by the 'inner' loop that starts on line 21
    for(i = 0;i < 6; i++) { // Check each other number in the array
        for(int j = i; j < 6; j++) { // Check the rest of the numbers
            if(j != i) { // Makes sure don't check number against itself
                if(userNumbers[i] == userNumbers[j]) {
                    b = true;
                }
            }
            if(b == true) { // If there is a duplicate, change that particular number
                cout << "Please re-enter number " << i + 1 << ". Duplicate numbers are not allowed:" << endl;
                cin >> userNumbers[i];
            }
        } // Comparison loop
        b = false; // Reset the boolean after each number entered has been checked
    } // Main check loop

它工作得很好,但我想知道是否有更优雅或更有效的检查方式。

原文由 Saladin Akara 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 754
2 个回答

您可以在 O(nlog(n)) 中对数组进行排序,然后只需查看下一个数字。这比您现有的 O(n^2) 算法快得多。代码也干净了很多。您的代码也不能确保在重新输入时没有插入重复项。您需要首先防止重复存在。

 std::sort(userNumbers.begin(), userNumbers.end());
for(int i = 0; i < userNumbers.size() - 1; i++) {
    if (userNumbers[i] == userNumbers[i + 1]) {
        userNumbers.erase(userNumbers.begin() + i);
        i--;
    }
}

我还建议使用 std::set - 那里没有重复项。

原文由 Puppy 发布,翻译遵循 CC BY-SA 3.0 许可协议

业力不足,无法发表评论。因此有一个帖子。

    vector <int> numArray = { 1,2,1,4,5 };
   unordered_map<int, bool> hasDuplicate;
   bool flag = false;
   for (auto i : numArray)
   {
      if (hasDuplicate[i])
      {
         flag = true;
         break;
      }
      else
         hasDuplicate[i] = true;
   }

   (flag)?(cout << "Duplicate"):("No duplicate");

原文由 Subh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题