C ++,通过数组排序来查找唯一性

时间:2016-09-26 18:43:03

标签: c++ arrays sorting unique

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

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

如何在C ++中使用嵌套for循环从后到前对这些数字进行排序,以确定唯一性所需的数字位数?

从示例中您可以看出,您需要从后面找到3个数字,以确保没有数字包含类似的数字尾部。 50234,50934 = 3位数,使它们唯一= 502和509。

for循环看起来像是逐个遍历每个数字,逐个数字,并排序相同的数字以达到3的输出?

会是这样的:

4

6 - 丢弃此号码,它不相同

4

4

然后:

3

5 - 丢弃此号码

3

然后:

2

9华友世纪!没有类似的数字了,打印3就是答案。

我很难过,无法弄清楚。

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

假设您从

开始
#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;
    }
}

答案 1 :(得分:0)

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

我们制作了理解和实践的代码,但在真实的程序中,我们使用的库太强大而且快速:

5000