数组中的数字重复

Duplicate numbers in an array

本文关键字:数字 数组      更新时间:2023-10-16

我需要编写一个程序,在该程序中,我必须打印数组中出现两次或两次以上的数字。为了更简单,我正在处理一个排序数组。

这是我的密码。

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