Как проверить, имеют ли 3 элемента массива одинаковое значение - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь написать программу, которая проверяет, совпадают ли 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 ]

1 голос
/ 25 октября 2019

Вы можете использовать следующий алгоритм: сначала отсортируйте массив. Затем итерируйте каждую соседнюю пару. Если они равны, то увеличить счетчик, если нет, то сбросить счетчик на 1. Если счетчик равен 3, вернуть true. Если цикл не возвращает true, возвращает false.

0 голосов
/ 25 октября 2019

Другой способ сделать это - использовать std::map, который ведет подсчет количества раз, когда данное значение встречается в вашем массиве. Вы перестанете искать, как только у вас появится число, которое имеет три вхождения.

Вот «минималистская» версия кода:

#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;
}

Я не говорю, что это лучше (илихуже других ответов - просто еще один способ решения проблемы и использования возможностей стандартной библиотеки. Кроме того, при таком подходе вы можете легко изменить код, чтобы подсчитать, сколько чисел встречается три или более раз или любое количество раз.

Не стесняйтесь просить дополнительных разъяснений и / или объяснений.

0 голосов
/ 25 октября 2019

Сбрасывайте skirt в 0 каждый раз, когда вы увеличиваете i, если оно меньше 3, или break в противном случае.

0 голосов
/ 25 октября 2019

Добавьте следующее условие во внешний цикл 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 равных элементов.

...