Вывести первый элемент массива строк, который встречается один раз - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть массив с именами, и мне нужно распечатать имя, которое встречается только один раз.Например, у меня есть следующие имена:

Джо, Энди, Альберт, Энди, Тайлер, Альберт.

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

Вот моя программа:

#include <iostream>

using namespace std;

int main()
{
int size;
cin >> size;
string trash;

string arr[size];

for (int i=0; i<size; i++)
{
    cin >> arr[i];
}

getline(cin,trash);

string first;
for (int i=0; i<size; i++)
{
   if ( arr[i] != arr[i+1] )
    first = arr[i];
}

cout << first << endl;
}

Ответы [ 4 ]

0 голосов
/ 24 декабря 2018

Я не проверил это полностью, но я бы пошел на такой подход.Алгоритм min_element играет хорошо:

#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>

using namespace std;

vector<string> testNames;

int main()
{
    testNames.push_back("Joe");
    testNames.push_back("Andy");
    testNames.push_back("Albert");
    testNames.push_back("Andy");
    testNames.push_back("Tyler");
    testNames.push_back("Albert");
    map<string, vector<int>> nameHits;

    for (size_t i = 0; i != testNames.size(); ++i)
        nameHits[testNames.at(i)].push_back(i);

    map<string, vector<int>>::const_iterator cIter;
    cIter = min_element(nameHits.cbegin(), nameHits.cend(), 
        [](const pair<string, vector<int>>& e1, const pair<string, vector<int>>& e2)
        { return e1.second.size() == 1 && e1.second.at(0) < e2.second.at(0); });

    if (cIter->second.size() != 1 || cIter == nameHits.end())
        cout << "";
    else
        cout << (*cIter).first;

    getchar();
}
0 голосов
/ 24 декабря 2018

Вот моя версия:

#include <iostream>
using namespace std;
int main()
{
int size;
cin >> size;
// string trash;
string arr[size];
for (int i=0; i<size; i++){
    cin >> arr[i];
}
// getline(cin,trash);
string first;
for (int i=0; i<size; i++)
{
    first = arr[i];
    for (int j = 0; j < size; ++j){
        if ( arr[i] == arr[j] && i!=j)
            first = "";
    }
    if (first == arr[i])
        break;
}

cout << first << endl;
}
0 голосов
/ 24 декабря 2018

Ну, с помощью c ++ stl вы можете сделать свою жизнь намного проще, дайте мне знать, если вы не понимаете какую-либо часть.

ниже - это реализация

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

int main()
{
    int n;
    cin>>n;
    vector<string>a(n);
    for(int i=0;i<n;i++)
        cin>>a[i];

    unordered_map<string,int>mapping; // to store the freqency of each unique string
                                      //actually we are intending to map each unique string to its frequency

    for(int i=0;i<n;i++)
    {
        mapping[a[i]]+=1; //incrementing the frequency of same string 
    }
    bool success=0;
    for(int i=0;i<n;i++)
    {
        if(mapping[a[i]]==1) //if first time we get a string whose frequency is 1 we print it and break out of the loop
            {
                cout<<a[i]<<"\n";
                success=1;
                break;
            }
    }
    if(success==0)
       cout<<"\n";


return 0;}
0 голосов
/ 24 декабря 2018

Дело в том, что разница между концепцией стека и кучи.

Для массива с динамическим размером попробуйте std::vector,

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int size;
    cin >> size;
    string trash;

    vector<string> arr;
    arr.assign(size,"");

    for (int i=0; i<size; i++)
    {
        cin >> arr[i];
    }

    getline(cin,trash);

    string first;
    for (int i=0; i<size; i++)
    {
        if ( arr[i] != arr[i+1] )
            first = arr[i];
    }

    cout << first << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...