说我有一个包含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就是答案。
我很难过,无法弄清楚。
非常感谢任何帮助,谢谢。
答案 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