好吧,我必须找到数组中有多少个不同的数字。
例如,如果数组是:1 9 4 5 8 3 1 3 5
输出应为6,因为1,9,4,5,8,3是唯一的,1,3,5是重复的(不是唯一的)。
所以,到目前为止,这是我的代码......没有正常思考。
#include <iostream>
using namespace std;
int main() {
int r = 0, a[50], n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int j = 0; j < n; j++) {
for (int k = 0; k < j; k++) {
if (a[k] != a[j]) r++;
}
}
cout << r << endl;
return 0;
}
答案 0 :(得分:12)
让我参加聚会;)
您也可以使用哈希表:
#include <unordered_set>
#include <iostream>
int main() {
int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };
const size_t len = sizeof(a) / sizeof(a[0]);
std::unordered_set<int> s(a, a + len);
std::cout << s.size() << std::endl;
return EXIT_SUCCESS;
}
这并不重要,但对于大型阵列来说,这可能会有最佳性能。
如果最小和最大元素之间的差异相当小,那么你可以做得更快:
vector<bool>
(如果您在编译时知道数组元素,我建议使用std::bitset
,但是您可以只计算所有内容在编译时使用模板元编程无论如何)。vector<bool>
。true
中vector<bool>
的数量。答案 1 :(得分:8)
std::set
仅包含唯一元素。
#include <set>
int main()
{
int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };
std::set<int> sa(a, a + 9);
std::cout << sa.size() << std::endl;
}
答案 2 :(得分:4)
这个怎么样?
#include <list>
int main()
{
int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5};
std::list<int> la(a, a+9);
la.sort();
la.unique();
std::cout << la.size() << std::endl;
return 0;
}
答案 3 :(得分:1)
既然您已声明不能使用标准库并且必须使用循环,那么让我们尝试使用此解决方案。
#include <iostream>
using namespace std; // you're a bad, bad boy!
int main()
{
int r = 0, a[50], n;
cout << "How many numbers will you input? ";
cin >> n;
if(n <= 0)
{
cout << "What? Put me in Coach. I'm ready! I can do this!" << endl;
return -1;
}
if(n > 50)
{
cout << "So many numbers! I... can't do this Coach!" << endl;
return -1;
}
cout << "OK... Enter your numbers now." << endl;
for (int i = 0; i < n; i++)
cin >> a[i];
cout << "Let's see... ";
// We could sort the list but that's a bit too much. We will choose the
// naive approach which is O(n^2), but that's OK. We're still learning!
for (int i = 0; i != n; i++)
{ // Go through the list once.
for (int j = 0; j != i; j++)
{ // And check if this number has already appeared in the list:
if((i != j) && (a[j] == a[i]))
{ // A duplicate number!
r++;
break;
}
}
}
cout << "I count " << n - r << " unique numbers!" << endl;
return 0;
}
我敦促你不提交此代码作为您的作业 - 至少在没有理解它的情况下。你只会给自己一个伤害,很可能你的导师会知道你没有写过它:我以前一直是一个年级学生,当某人的代码质量神奇地改善时,这是相当明显的。
答案 4 :(得分:0)
我认为增加r值的位置不正确
#include <iostream>
using namespace std;
int main()
{
int r=0,a[50],n;
cin >>n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for (int j=0;j<n;j++)
{
bool flag = true;
for(int k=;k<j;k++)
{
if(a[k]!=a[j])
{
flag = false;
break;
}
}
if (true == flag)
{
r++;
}
}
cout << r << endl;
return 0;
}
然而,我的建议是使用更复杂的算法(该算法具有O(N ^ 2))。
答案 5 :(得分:0)
这应该有效,但它可能不是最佳解决方案。
#include <iostream>
using namespace std;
int main()
{
int a[50],n;
int uniqueNumbers; // this will be the total numbers entered and we will -- it
cin >>n;
uniqueNumbers = n;
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for (int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
/*
the and clause below is what I think you were missing.
you were probably getting false positatives when j == k because a[1] will always == a[1] ;-)
*/
if((a[k] == a[j]) && (k!=j))
{ uniqueNumebers--; }
}
}
cout << uniqueNumbers << endl;
return 0;
}
答案 6 :(得分:0)
我们可以在这个程序中使用C ++ STL向量。
int main()
{
int a[] = {1, 9, 4, 5, 8, 3, 1, 3, 5};
vector<int>v(a, a+9);
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
cout<<v.size()<<endl;
return 0;
}
答案 7 :(得分:0)
请干运行代码 在外部for循环中查看每个元素,它在内部循环内计数多于一个。我们说循环包含1,2,3,4.1 .....元素在第二次迭代中运行它并且第三次迭代1是因为1是1!= 2以及1!= 3
现在解决时间!!
#include<iostream>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
ll arr[1000007]={0};
int main()
{
ios_base::sync_with_stdio(false);//used for fast i/o
ll n;cin>>n;
for(ll i=1;i<=n;i++)
cin>>arr[i];
sort(arr,arr+n);
ll cnt=0;
for(ll i=1;i<=n-1;i++)
{
if(arr[i+1]-arr[i]==0)
cnt++;
}
cout<<n-cnt<<endl;
cin.tie(NULL);
return 0;
}