在数组中找到两个或多个相同的元素?

时间:2017-09-19 15:05:15

标签: c++ arrays for-loop

假设我有一个像这样的数组a [6] = {1,2,1,3,2,1,5}  我想打印1,2。  我试过了:

#include<iostream>
using namespace std;
int main()
{
    int a[50] = {1,2,3,43,5,1,6,7,4,43,1};
    int c=0,b = sizeof(a)/sizeof(int);
    for(int y=0;y<11;y++)
    {

        for(int q = y+1;q<11;q++)
        {
                        if(a[y]=a[q])
                        {
                                  cout<<a[q]<<endl;

                        }
                    }

        }
    }
输出:1,1,1,1,2。 如果我设置像{1,2,3,4,1,2}这样的元素 它给出了输出:1,2。

请帮帮我。我想只打印两个或更多重复的数字。

4 个答案:

答案 0 :(得分:1)

请注意此if语句中的拼写错误

if(a[y]=a[q])
      ^^^

必须有比较运算符而不是赋值。

然而,如果你要更新你的程序,它的算法仍然是错误的。

使用循环的直接方法可以采用以下方式(我假设数组本身可能不会更改)

#include <iostream>

int main() 
{
    int a[] = { 1, 2, 3, 43, 5, 1, 6, 7, 4, 43, 1 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N - 1; i++ )
    {
        size_t j = 0;
        while ( j < i && a[j] != a[i] ) j++;

        if ( j++ == i )
        {
            while ( j != N && a[j] != a[i] ) j++;
            if ( j != N ) std::cout << a[j] << ' ';
        }
    }

    std::cout << std::endl;

    return 0;
}

程序输出

1 43 

对于数组的每个当前元素,您需要检查它是否是早期遇到的。

另一种方法是使用标准容器std::map

例如

#include <iostream>
#include <map>
#include <iterator>

int main() 
{
    int a[] = { 1, 2, 3, 43, 5, 1, 6, 7, 4, 43, 1 };
    std::map<int, size_t> m;

    for ( int x : a ) ++m[x];

    for ( const auto &p : m )
    {
        if ( p.second != 1 ) std::cout << p.first << ' ';
    }

    std::cout << std::endl;

    return 0;
}

答案 1 :(得分:0)

更多c ++ ish的解决方案

#include <iostream>
#include <vector>
#include <map>

int main()
{
    std::vector<int> a =  { 1, 2, 3, 43, 5, 1, 6, 7, 4, 43, 1 };
    std::map<int,int> count;

    for(const auto& it:a)
    {
        auto hit = count[it]++;
        if(hit == 1)
            std::cout << it << " ";
    }
}

答案 2 :(得分:0)

标准库包含解决此问题所需的所有位。诀窍是首先对数组进行排序,这确保所有相等的元素彼此相邻。然后我们可以在数组中搜索相等的范围。

#include <algorithm>
#include <iostream>

int a[] = {1,2,3,43,5,1,6,7,4,43,1};

int main()
{
  std::sort(std::begin(a), std::end(a));

  auto current = std::begin(a);
  while (current != std::end(a))
  {
    // If the current element is followed by 1 or more equal elements, then
    // we've found a repeated value.
    auto range = std::equal_range(current + 1, std::end(a), *current);
    if (range.first != range.second)
    {
      std::cout << *begin << std::endl;
    }
    current = range.second;
  }
}

答案 3 :(得分:0)

我希望我的代码可以帮到你,

我在代码上添加了标记,以帮助您了解我所做的事情。

我的解决方案背后的想法是在此之后保存新阵列中的数字以打印元素。 如果您的数组具有特定的功能(例如所有nubmers> 0),您可以将它用于标记元素(例如,在&gt; 0的示例中,您可以使用 - 1标记),然后传递数组。 / p>

#include<iostream>

 //change the number 11 to define, for redability
 #define NUMBER_OF_ELEMENTS 11
    using namespace std;
    int main()
    {


    //new Parameters : dupArr[50] - save the duplicate numbers
    //                 count - tell us which is the last element at
    //                         b[50] that we add
    //                 iAddOneNumber - flag that tell us we add one element at  
    //                                 that iteration


        int dupArr[50]= {};
        int count=0;
        bool iAddOneNumber=false;
        int a[50] = {1,2,3,43,5,1,6,7,4,43,1,...,};
        int c=0,b = sizeof(a)/sizeof(int);
        for(int curElem=0;y< NUMBER_OF_ELEMENTS; curElem ++)
    {

        for(int chkElem = curElem +1; chkElem < NUMBER_OF_ELEMENTS; chkElem ++){
       // you assign here and you need to add more "=" for compare
          if(a[curElem]==a[chkElem]){
             // instead of print from the condition my advice is to
             // save in another place the numbers - for example - b[50]
            if(iAddOneNumber==false){
             dupArr[count]=a[curElem];
             count++;
             iAddOneNumber=true;
            }
        }
      iAddOneNumber=false;
      }
    for(int i=0 ; i<NUMBER_OF_ELEMENTS ; i++){
     if(i<count){
        std::cout << dupArr[i];   
      }
    }
  }

}