对数组中的数字进行排序以找出唯一性

C++, sort through array of numbers to find uniqueness

本文关键字:排序 唯一性 数组 数字      更新时间:2023-10-16

假设我有一个包含4个不同数字的数组。

int numbers[4] = {50234,50356,50454,50934};

如何在c++中创建一个嵌套的for循环来从后到前对这些数字进行排序,以确定唯一性所需的数字数量?

从这个例子中你可以看出,你需要从后面的3个数字来确保没有数字包含类似的数字尾部。50234、50934 = 3位数字,使它们唯一= 502、509

如果一个接一个,一个接一个地遍历这些数字,并将相同的数字排序以达到输出3,for循环会是什么样子?

就像这样:

4

6 -丢弃这个数字,它不相同

4

4

:

3

5 -丢弃这个数字

3

:

2

9华友世纪!没有相似的数字了,打印出3作为答案。

我被难住了,想不出来。

假设你以

开头
#include <unordered_set>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    const std::vector<int> numbers{50234, 50356, 50454, 50934};

可以将其转换为字符串向量:

    std::vector<std::string> string_numbers;
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); });

现在我们将检查所需的位数,从1开始:

    size_t digits = 1;
    while(true) {

在每次迭代中,我们将创建一个unordered_set

        std::unordered_set<std::string> partials;

对于每个数字,我们将尝试将其digits位放入集合中:

        for(const auto &s: string_numbers) {
            if(s.size() <= digits) {
                std::cout << "not unique" << std::endl;
                return 0;
            } 
            partials.insert(s.substr(0, digits));
        }

如果集合的大小等于向量的大小,就完成了:

        if(partials.size() == numbers.size()) {
                std::cout << digits << " required" << std::endl;
                return 0;
            }

否则,我们需要增加位数:

        ++digits;
    }
}

完整代码:

#include <unordered_set>
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    const std::vector<int> numbers{50234, 50356, 50454, 50934};
    std::vector<std::string> string_numbers;
    std::for_each(std::begin(numbers), std::end(numbers), [&](int n){ string_numbers.push_back(std::to_string(n)); });
    size_t digits = 1;
    while(true) {
        std::unordered_set<std::string> partials;
        for(const auto &s: string_numbers) {
            if(s.size() <= digits) {
                std::cout << "not unique" << std::endl;
                return 0;
            } 
            partials.insert(s.substr(0, digits));
        }
        if(partials.size() == numbers.size()) {
                std::cout << digits << " required" << std::endl;
                return 0;
            }
        ++digits;
    }
}

如果你想对数字进行排序,那么使用一种排序算法,比如冒泡排序。然后检查唯一性并将唯一性值存储在一个新的数组中,然后打印它们:

我们编写代码是为了理解和实践,但在实际的程序中,我们使用库,它们太强大和快速了:

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    int numbers[4] = {50234, 50356, 50454, 50934};
//  int numbers[4] = {50234, 50356, 50454, 50356};
    for(int i(0); i < 4; i++)
    {
        for(int j(i + 1); j < 4; j++)
        {
            if(numbers[i] > numbers[j])
            {
                numbers[i] ^= numbers[j];
                numbers[j] ^= numbers[i];
                numbers[i] ^= numbers[j];
            }
        }
    }
    for(int i = 0; i < 4; i++)
        cout << numbers[i] << ", ";
    int  nUniq = 0;
    bool isUniq = true;
    for(int i = 0; i < 4; i++)
    {
        isUniq = true;
        for(int j(i + 1); j < 4; j++)
        {
            if(numbers[i] == numbers[j])
            {
                isUniq = false;
                break;
            }
        }
        if(isUniq)
            nUniq++;
    }
    cout << nUniq << endl;
    int* ptrUniq = new int[nUniq];
    int k = 0;
    for(int i = 0; i < 4; i++)
    {
        isUniq = true;
        for(int j(i + 1); j < 4; j++)
        {
            if(numbers[i] == numbers[j])
            {
                isUniq = false;
                break;
            }
        }
        if(isUniq)
        {
            ptrUniq[k] = numbers[i];
            k++;
        }
    }
    cout << "nhere are uniq values:nn";
    for(int i = 0; i < nUniq; i++)
        cout << ptrUniq[i] << ", ";
    delete[] ptrUniq;
    ptrUniq = NULL;

    cout << endl << endl;
    return 0;
}