我想计算数组中所有不同的字符串元素。 所以我的输入是:
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;
}
答案 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);
答案 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 但是代码检查了整个列表,因此您永远不会在列表中两次计算世界抽动。