如何在C++中对数组进行排序和检查重复项
How can I sort and check an array for duplicates in C++?
我试图解决的问题是在用户将值输入数组时检查数组。具体说明是:使用单独的方法进行检查;该方法必须首先对数组进行排序;重复检查必须实时执行,这意味着用户不会首先输入所有值,然后数组返回并检查它们。我环顾四周,虽然我已经弄清楚了如何排序,但我完全不知道如何在输入每个值时检查重复项。谁能把我推向正确的思维方向?
这就是我想出的,在作业范围内工作:
void getLottoPicks(int numbers[])
{
cout << "Please enter your 7 lotto number picks between 1 and 40: " << endl;
for (int i = 0; i < SIZE; i++)
{
cout << "Selection #" << i + 1 << endl;
cin >> numbers[i];
while (numbers[i] < 1 || numbers[i] > 40)
{
cout << "Please choose a number between 1 and 40: " << endl;
cin >> numbers[i];
}
for (int j = 0; j < i; j++)
{
while (numbers[i] == numbers[j])
{
cout << "You have already picked that number. Enter a different one: " << endl;
cin >> numbers[i];
}
}
}
}
它的编译和运行没有任何错误(无论如何,我还没有发现任何错误)。如果有人有任何反馈,将不胜感激。我知道这种算法效率非常低,但是我们的数组只有 7 个值长,这就是所要求的。最初我认为必须对其进行排序,但只有当我们选择在不同的功能中进行检查时才需要这样做。
选项可以做到这一点。
首先,如果你只使用数组,使用 std :: sort 和 std :: unique。
如果数组中的最大数字不是很大,你可以维护一个布尔数组,你可以将其设置为 0。
#include <cstring> bool a[100000]; memset(a,0,sizeof a) main(){ int x,i,arr[1000]; while(cin>>x){ if( a[x] == 0) arr[i++]=x,a[x]=1; }
在数组中输入值之前,请检查该数字的索引值是否为 0。
如果为 0,则在数组中输入值,将布尔数组的索引标记为 1。稍后您可以使用
#include<algorithm>
sort(arr,arr+(size of arr));
3.您可以维护一个集合来输入值,而不是数组,它将是一个二叉树,并且会丢弃任何重复值,插入后的值将按排序顺序排列。
#include <set>
set <int> arr;
main(){
int x;
while(cin>>x)
a.insert(x);
}
您可以使用迭代器从集合中获取值,例如
set<int> :: iterator it;
- 获取第一个输入。 把它放在数组中。
- 获取另一个输入。 检查它是否与数组中已有的任何其他内容不匹配。 如果是,请丢弃它。 如果没有,请按顺序将其放入数组中(以便数组保持排序)。
- 重复步骤 2。
或者,如果分配允许,请使用集合。
如果您不允许使用集合,请使用向量。 向量将允许您轻松地在特定索引处插入元素,以帮助保持排序。 当您向其添加元素时,它会自动调整大小。
由于您的数字是 1-40 之间的整数,因此您可以使用简单而快速的解决方案 (O(1))。您可以重复使用此技巧稍后进行排序。以下是主要内容:
- 创建一个布尔数组,其中 40 个元素初始化为 false。我称之为
vals
. - 每次读取值时,请检查
vals[input_value]
的值。如果是true
,则为重复项,否则设置为true
。 - 现在,为了对值进行排序,您只需执行从 1 到 40 的 for 循环,如果
vals[i]
为 true,则放入另一个数组或打印它。
这是我的解决方案:
void getLottoPicks(int numbers[])
{
cout << "Please enter your 7 lotto number picks between 1 and 40: " << endl;
int value;
bool vals[41];
for (int i = 0; i <= 40; i++) vals[i] = false;
for (int i = 0; i < SIZE; i++)
{
cout << "Selection #" << i + 1 << endl;
bool input_ok = false;
while (!input_ok)
{
cin >> value;
if (value < 1 || value > 40) {
cout << "Please choose a number between 1 and 40: " << endl;
} else if (vals[value]) {
cout << "You have already picked that number. Enter a different one: " << endl;
} else {
input_ok = true;
}
}
vals[value] = true;
}
int j = 0;
for (int i = 1; i <= 40; i++) {
if (vals[i]) {
numbers[j++] = i;
}
}
}
此算法的灵感来自计数排序算法。计数排序算法是一种非常简单有效的算法,可以在元素为小整数时使用。
- valgrind-hellgrind与泄漏检查的结果不同
- C++ STL 排序会检查 NaN 吗?
- 检查向量是否使用除法和阻抗算法进行排序
- 如何检查队列是否使用 STL 排序
- 如何检查排序算法的空间复杂性
- c ++ 是否有 STL 算法来检查范围是否严格排序
- 当有多个查询时,检查某些子数组是否排序的有效方法是什么?
- 排序健全性检查
- 如何检查传递给函数的容器是否已排序,如果没有,则对其进行排序
- 使用不同的比较函数对 std::set 进行排序和重复检查
- Bool排序的插入函数,检查列表中是否已经存在int
- 简单的数组排序/检查 划分和征服版本
- 哪种数据结构按插入排序并具有快速"contains"检查?
- 函数,用于检查数组是否已排序
- 正在检查排序列表中是否有一个范围内的数字
- 严格弱排序的自动检查
- 如何在C++中对数组进行排序和检查重复项
- 如何使用 c++ 检查链表是否排序
- 未排序链表实现检查完毕
- 检查矢量是否排序的最佳算法