数组中的重复数字

时间:2014-09-07 22:00:42

标签: c++ c arrays loops for-loop

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

这是我的代码。

#include <stdio.h>
int main()
{
    int n,i;
    int a[10]={2,2,2,4,6,6,9,10,10,11};
    printf("%d\n",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]的值与[-1]和[9]的值与[10]进行比较,两者都是这些,[-1]和[10]是垃圾值。我确信有更好的方法可以做到,但我无法想到任何。

另外,我需要扩展上述程序来计算重复数字的频率。

帮助表示赞赏。谢谢!

6 个答案:

答案 0 :(得分:2)

首先,您无法访问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]);
}

答案 1 :(得分:1)

请参阅下面的代码以获取解决方案,该解决方案仅打印阵列中的重复数字以及它们出现的次数。

我添加了用于计数的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;
}

答案 2 :(得分: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: %d\n", a[j], duplicateCount);
    duplicateCount = 1; // Reset for next values
}

如果要计算所有数字的频率,可以轻松地将duplicateCount转换为值数组,以计算每个唯一值的频率。为了获得更好的解决方案,您可以使用其他数据结构,例如地图。

答案 3 :(得分:0)

你真的需要有两个索引遍历你的数组。 这是一个开始:

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("%d\n", a[i]);
    i = j;
}

答案 4 :(得分:0)

您可以使用仿函数,重载运算符()并返回(唯一值)。假设您的数组已排序,只需将前一个数组与下一个数组进行比较,如果它们相等则将其插入到集合中。如果它们没有排序,那么你必须为每个条目遍历整个数组。以下是输出作为解释的两个例子。

#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

我希望它有所帮助!

答案 5 :(得分:0)

#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 %d\n", tmp, c);
        --i;
    }
    return 0;
}