如何检查数组的3个元素是否具有相同的值

时间:2019-10-25 15:04:11

标签: c++ loops for-loop

我正在尝试编写一个程序来检查数组的3个(或更多)元素是否相同。

我编写了几乎可以完美运行的代码,但是当有3对相等的元素并且我不确定如何解决它时,它就会卡住。

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
  int n, a[10],skirt=0;
  cin >> n;
  for(int i = 0; i < n; i++)
  {
    cin >> a[i];
  }
  for(int i = 0; i < n; i++)
  {
    for(int j = i + 1; j < n; j++)
    {
      if(a[i] == a[j])
      {
      skirt++;
      }

    }
  }
  cout<<skirt<<endl;
  if(skirt>=3)
  {
    cout << "TAIP" << endl;
  }
  else
  {
    cout << "NE" << endl;
  }
}

当我输入

6 
3 3 2 2 1 1 i 

获取"TAIP",但我需要获取"NE"

4 个答案:

答案 0 :(得分:1)

您可以使用以下算法:首先对数组进行排序。然后迭代每个相邻的对。如果它们相等,则增加计数器,如果不相等,则将计数器重置为1。如果计数器为3,则返回true。如果循环未返回true,则返回false。

答案 1 :(得分:0)

在外部for循环中添加以下条件

  for(int i = 0; i < n - 2 && skirt != 3; i++)
                 ^^^^^^^^^^^^^^^^^^^^^^^
  {
    skirt = 1;
    ^^^^^^^^^
    for(int j = i + 1; j < n; j++)
    {
      if(a[i] == a[j])
      {
      skirt++;
      }
    }
  }

当然,在循环之前,您应该检查n是否不小于3。例如

if ( not ( n < 3 ) )
{ 
      for(int i = 0; i < n - 2 && skirt != 3; i++)
      {
        skirt = 1;
        for(int j = i + 1; j < n; j++)
        {
          if(a[i] == a[j])
          {
          skirt++;
          }
        }
      }
}

这是一个演示程序

#include <iostream>
using namespace std;

int main() 
{
    int a[] = { 6, 3, 3, 2, 2, 1, 1 };
    int n = 7;
    int skirt = 0;

    if ( not ( n < 3 ) )
    { 
        for(int i = 0; i < n - 2 && skirt != 3; i++)
        {
            skirt = 1;
            for(int j = i + 1; j < n; j++)
            {
                if ( a[i] == a[j] )
                {
                    skirt++;
                }
            }               
        }
    }

    cout << skirt << endl;

    if ( skirt == 3 )
    {
        cout << "TAIP" << endl;
    }
    else
    {
        cout << "NE" << endl;
    }

    return 0;
}

其输出为

1
NE

因为数组没有3个相等的元素。

答案 2 :(得分:0)

每次将skirt增加到小于3时,将i重置为0,否则将break重置为循环。

答案 3 :(得分:0)

执行此操作的另一种方法是使用std::map,它可以计算给定值在数组中出现的次数。一旦您的数字出现了3次,您就会停止寻找。

这是“极简”代码版本:

#include <iostream>
#include <map>
using std::cin;  // Many folks (especially here on SO) don't like using the all-embracing
using std::cout; // ... statement, "using namespace std;".   So, these 3 lines only 'use'
using std::endl; // ... what you actually need to!

int main() {
    int n, a[10], skirt = 0;
    std::map<int, int> gots;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n && skirt < 3; i++) {
        skirt = 1;
        if (gots.find(a[i]) != gots.end()) skirt = gots[a[i]] + 1;
        gots.insert_or_assign(a[i], skirt);
    }
    cout << (skirt >= 3 ? "TAIP" : "NE") << endl;
    return 0;
}

我并不是说这比其他答案更好(或更糟),这只是解决问题的另一种方式,并且可以利用标准库提供的功能。另外,使用这种方法,您可以轻松地修改代码以计算3次或3次以上或任意次数出现的数字。

随时要求进一步的澄清和/或解释。