对数组中的数字进行排序以找出唯一性
C++, sort through array of numbers to find uniqueness
假设我有一个包含4个不同数字的数组。
int numbers[4] = {50234,50356,50454,50934};
如何在c++中创建一个嵌套的for循环来从后到前对这些数字进行排序,以确定唯一性所需的数字数量?
从这个例子中你可以看出,你需要从后面的3个数字来确保没有数字包含类似的数字尾部。50234、50934 = 3位数字,使它们唯一= 502、509
如果一个接一个,一个接一个地遍历这些数字,并将相同的数字排序以达到输出3,for循环会是什么样子?
就像这样:
46 -丢弃这个数字,它不相同
4 4:
3
5 -丢弃这个数字
3
:
29华友世纪!没有相似的数字了,打印出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;
}
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 有没有办法为集合指定不同的唯一性和排序标准
- 对两个不同字段进行排序并确定其唯一性的容器
- 对数组中的数字进行排序以找出唯一性