数组中的数字重复
Duplicate numbers in an array
我需要编写一个程序,在该程序中,我必须打印数组中出现两次或两次以上的数字。为了更简单,我正在处理一个排序数组。
这是我的密码。
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
printf("%dn",a[10]);
for(i=0;i<10;++i)
{
if(a[i]==a[i+1] && a[i]!=a[i-1])
printf("%d ",a[i]);
else
continue;
}
return 0;
}
代码似乎工作得很好,但我不喜欢我的代码,因为在某个时候,循环会将a[0]与a[-1]以及a[9]与a[10]的值进行比较,而这两个值,a[-1]和a[10],都是垃圾值。我确信有更好的方法可以做到这一点,但我想不出任何方法。
此外,我需要扩展以上程序来计算重复数字的频率。
感谢您的帮助。谢谢
首先,您不能访问printf行中的[10],这在您的数组之外。
这应该很好用。
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1])
if(i > 0 && a[i] == a[i-1])
continue;
else
printf("%d ",a[i]);
}
return 0;
}
编辑:或者你可以使用更短但更难阅读的:
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1] && (!i || a[i] != a[i-1]))
printf("%d ",a[i]);
}
请参阅下面的代码以获得解决方案,该解决方案将只打印数组中的重复数字及其出现的次数。
我加了用于你计数的int c。它最初设置为1,每个重复编号增加1。
#include <stdio.h>
using namespace std;
int main() {
int n,i,c;
int a[10]={2,2,2,4,6,6,9,10,10,11};
c = 1;
for(i=0; i < 9; ++i)
{
if (a[i] == a[i+1]) {
n = a[i];
c += 1;
} else {
if (c > 1) {
printf("Number: %d, Occurences: %d n",n,c);
c = 1;
}
}
}
return 0;
}
由于数组已经排序,所以在for
循环中使用另一个循环会更容易执行这样的操作。
int duplicateCount = 1; // Must be at least one instance of a value in the array
for(int i = 0; i < 9; ++i) {
int j = i;
while(j != 9 && a[j] == a[j + 1]) {
++j;
++duplicateCount;
}
i = j; // j is now at end of list of duplicates, so put i at the end as well,
// to be incremented to the next unique value at end of for loop iteration
printf("%d: %dn", a[j], duplicateCount);
duplicateCount = 1; // Reset for next values
}
如果你想计算所有数字的频率,你可以很容易地将duplicateCount
变成一个值数组,来计算每个唯一值的频率。为了获得更好的解决方案,可以使用其他数据结构,例如地图。
您确实需要有两个索引来遍历您的数组。这里有一个开始:
int i = 0;
int j;
while (i < 10) {
for (j = i+1; j < 10; ++j) if (a[i] != a[j]) break;
if (j !+ i+i) printf("%dn", a[i]);
i = j;
}
您可以使用一个函数、重载运算符()并返回一个集(唯一值)。假设您的数组已排序,只需将上一个数组与下一个数组进行比较,如果它们相等,则将其插入到集合中。如果它们没有排序,那么您必须遍历每个条目的整个数组。下面是两个示例,输出作为解释。
#include <set>
using namespace std;
未排序数组:
struct UnsortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
for (int j = i + 1;j < size; j++)
if (array[i] == array[j])
duplicates.insert(array[j]);
return duplicates;
}
};
排序数组:
struct SortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
if (array[i] == array[i+1])
duplicates.insert(array[j]);
return duplicates;
}
};
测试排序:
SortedArrayDuplicateEntries d;
int sorted[10]={2,2,2,4,6,6,9,10,10,11};
set<int> resultSorted = d(sorted,10);
for (int i : resultSorted) cout << i << endl;
输出排序:
2
6
10
测试未排序:
UnsortedArrayDuplicateEntries d;
int unsorted[10]={2,6,4,2,10,2,9,6,10,11};
set<int> resultUnsorted = d(unsorted,10);
for (int i : resultUnsorted) cout << i << endl;
输出未排序:
2
6
10
我希望它能有所帮助!
#include <stdio.h>
int main(){
int i, a[10]={2,2,2,4,6,6,9,10,10,11};
int size = 10;
for(i=0;i<size;++i){
int tmp = a[i];
int c = 1;
while(++i < size && tmp == a[i])
++c;
if(c > 1)
printf("%d times %dn", tmp, c);
--i;
}
return 0;
}
相关文章:
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 数组/c++中的大量数字
- 遍历并行数组以确定C++中的最大数字
- 整数区间(或 int 数组)中每个数字的出现次数
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 获取 2D 数组 c++ 中的所有数字对
- 为什么使用数组元素查找最大数字的程序不起作用?
- 如何从向量或数组中选择最常见的数字?(前五名)C++
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 以十为基数的数字到布尔数组,该数组要求二进制/基数为 2 的数字
- C++ 检查结果数组中有多少次数字
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在C++中有效地将数字值重新分配给字符数组
- 查找数组中的最小数字
- 查找数组中重复(重复)数字的索引
- 我必须找到给定数组中所有数字的周期,就像有很多解决方案,但数组的大小是 10^5
- 类、数字/数组或对象中的对象