在C ++中计算数组中不相等的字符串

时间:2018-11-10 21:36:06

标签: c++ arrays string count

我想计算数组中所有不同的字符串元素。 所以我的输入是:

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 :(得分:0)

问题是算法上的:每个项目都等于自己,这将过早地结束您的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);

Online demo

答案 1 :(得分:0)

如果我很好地理解了您的问题,您想要在数组中具有最大外观的值,则需要进行一些修改才能实现:

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

答案 2 :(得分:0)

最后一个if应该是if(k + 1 == N)

因为您总是在k达到N之前停一会儿

并且k必须从l开始

您的逻辑是,如果计数器不在列表的其余部分中,则将其加1 但是代码检查了整个列表,因此您永远不会在列表中两次计算世界抽动。