Подсчет не равных строк в массиве в C ++ - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу посчитать все различные строковые элементы в массиве. Таким образом, мой вклад будет:

5 Lemon Orange Lemon Mango Lemon

И вывод должен быть таким:

3

Проблема с моим кодом состоит в том, что мой код учитывает все элементы, а не только разные, и я не могу понять, почему.

Вот мой код:

#include <iostream>

using namespace std;

int main()
{
    int N;   
    cin >> N;
    string Tname;
    string data[N];
    int counter = 0;

    for(int i = 0; i<N; i++)
    {
        cin >> Tname;
        data[i] = Tname;
    }

    for(int l = 0; l<N; l++)
    {
        int k = 0;
        while(k<N && (data[l] != data[k]))
        {
            k++;
        }
        if(k<N)
        {
            counter += 1;
        }

    }
    cout << counter << endl;
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

если я хорошо понимаю вашу проблему, вы хотите, чтобы значение, которое имеет максимальные значения в массиве, необходимы некоторые модификации для достижения этого:

#include <iostream>

using namespace std;

int main()
{
    int N;   
    cin >> N;
    string Tname;
    string data[N];
    int counter = 0;

    for(int i = 0; i<N; i++)
    {
        cin >> Tname;
        data[i] = Tname;
    }

    int tempCounter; // a temporary counter for each item of the array .
    for(int l = 0; l < N; l++)
    {
        tempCounter = 0;
        int k = 0;
        while(k<N)
        {
            if(data[l] == data[k])
                tempCounter++;
            k++;
        }
        if(tempCounter > counter) // if the new counter is higher than the counter 
            counter = tempCounter;
    }
    cout << counter << endl;
    return 0;
}
0 голосов
/ 11 ноября 2018

последнее, если должно быть, если (k + 1 == N)

потому что вы все время останавливаетесь, пока k не достигнет N

и k должно начинаться с l

Ваша логика в том, что вы добавляете 1 к счетчику, если его нет в оставшейся части списка Но код проверяет полный список, чтобы вы никогда не учитывали дважды в мире.

0 голосов
/ 11 ноября 2018

Проблема алгоритмическая: каждый элемент равен самому себе, что преждевременно завершит ваш цикл k. Кроме того, вы увеличиваете только, когда элемент повторяется.

Я предлагаю вам изменить циклы, чтобы не сравнивать каждый элемент с любыми другими элементами, но только с элементами, с ранее обработанными элементами:

for(int l = 0; l<N; l++)
{
    int k = 0;
    while(k<l &&  data[l] != data[k])  // only previous items
    {
        k++;
    }
    if(k==l)   // if no identical, we can add this one
    {
        cout<<l<<" "<<data[l]<<endl;
        counter += 1;
    }
}

Не связано: массивы переменной длины недопустимы в C ++, даже если некоторые основные компиляторы принимают это. Я бы предложил использовать вектор для эмуляции этой функции: vector<string> data(N);

Демоверсия

...