在数组中查找唯一的数字

时间:2013-02-06 23:28:53

标签: c++ arrays for-loop numbers

好吧,我必须找到数组中有多少个不同的数字。

例如,如果数组是: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;
}

8 个答案:

答案 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;

}

这并不重要,但对于大型阵列来说,这可能会有最佳性能。


如果最小和最大元素之间的差异相当小,那么你可以做得更快:

  • 创建一个跨越min和max元素之间范围的vector<bool>(如果您在编译时知道数组元素,我建议使用std::bitset,但是您可以只计算所有内容在编译时使用模板元编程无论如何)。
  • 对于输入数组的每个元素,请在vector<bool>
  • 中设置相应的标志
  • 完成后,只需计算truevector<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;
}