在数组中查找唯一的数字

use*_*143 5 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;
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*vic 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;

}
Run Code Online (Sandbox Code Playgroud)

这并不重要,但这可能是大型阵列的最佳性能.


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

  • 创建一个vector<bool>跨越min和max元素之间的范围(如果你在编译时知道数组元素,我建议std::bitset改为,但是你可以使用模板元编程计算编译时的所有内容).
  • 对于输入数组的每个元素,请在其中设置相应的标志vector<bool>.
  • 完成后,只需计算中的trues 数vector<bool>.


dre*_*lax 8

A 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;
}
Run Code Online (Sandbox Code Playgroud)


bil*_*llz 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;
}
Run Code Online (Sandbox Code Playgroud)