【问题标题】:How to print the number of duplicate elements in array in C如何在C中打印数组中重复元素的数量
【发布时间】:2021-03-11 01:07:40
【问题描述】:

任何帮助将不胜感激。在下面的这段代码中,我知道我们需要使用“j=i+1”,因为原始数组和重复数组中的相同元素不应被记录为重复元素。但是,假设在第二个循环中,当 i=2,所以 j=3,那么循环将从第三个元素开始运行,对吗?它将如何将数组中的第二个元素与副本中的第一个元素进行比较?它不会因为它是 j+1 而错过副本中的第一个元素吗? 请向我解释一下,我是编程初学者。还有,为什么要使用count++? 有人可以向我解释一下吗...?

#include <stdio.h>

#define MAX_SIZE 100  // Maximum array size

int main()
{
    int arr[MAX_SIZE];
    int i, j, size, count = 0;

    /* Input size of array */
    printf("Enter size of the array : ");
    scanf("%d", &size);

    /* Input elements in array */
    printf("Enter elements in array : ");
    for(i=0; i<size; i++)
    {
        scanf("%d", &arr[i]);
    }

    /*
     * Find all duplicate elements in array
     */
    for(i=0; i<size; i++)
    {
        for(**j=i+1**; j<size; j++)
        {
            /* If duplicate found then increment count by 1 */
            if(arr[i] == arr[j])
            {
                **count++;**
                break;
            }
        }
    }

    printf("\nTotal number of duplicate elements found in array = %d", count);

    return 0;
}

【问题讨论】:

  • ... 数组... 第 0 步:对数组进行排序
  • @pmg 你是什么意思
  • 抱歉简洁了。我的意思是,如果您遇到涉及数组的问题,首先要做的就是对数组进行排序。排序为O(n.logn);即使不是绝对需要,也不会对问题的其余部分产生太大影响……如果您在O(n) 中找到解决方案,则可以删除排序
  • 如果对数组进行排序,所有重复项都会相邻。这将简化计数。
  • @pmg:“对数组排序”对于询问简单循环和count++ 的人来说是一个高级概念。教学需要教给学生与他们已经知道的东西相邻的东西,而不是超出他们目前可见的东西。

标签: arrays c duplicates


【解决方案1】:

回答你的问题(希望我能理解):

  • i == 0 时,您将第一个元素与所有其他元素进行比较 - 要么找到一些重复项,要么没有。
  • i == 1 时,您将第二个元素与除第一个元素之外的所有元素进行比较 - 您无需与第一个元素进行比较,因为在上一步中您已经完成了
  • 等等。

【讨论】:

  • 但是我们没有比较第二个元素和第一个元素对吧?为什么会这样?
  • 他们必须处理的一个问题是 [1, 2, 1, 3, 1]。那么a[0] 等于a[2] 并计为重复,a[2] 等于a[4] 并计为另一个重复。
  • @tiara 您确实在 i == 0 和 j == 1 时进行了比较,您无需再次比较。换句话说,当 i == 1 和 j == 0 时,您不需要状态。
【解决方案2】:

有多种方法可以考虑这一点。首先,考虑您拥有的代码:

for(i=0; i<size; i++)
{
    for(j=i+1; j<size; j++)
    {
        /* If duplicate found then increment count by 1 */
        if(arr[i] == arr[j])
        {
            count++;
            break;
        }
    }
}

语句count++; 递增存储在count 中的值。 break 结束内循环(此时外循环继续,并可能开始内循环的不同执行)。

您可以在 [1, 2, 3]、[1, 1, 2] 和 [1, 2, 1] 等简单示例上尝试此代码。你得到了什么结果?

接下来,在 [1, 1, 1] 或 [1, 2, 1, 3, 1] 上试一试。你得到什么结果?你想要什么结果?

您能否描述代码产生与您想要的结果不同的情况的特征?

一旦你这样做了,你能想出一个解决方案吗?代码做了什么你不希望它做的事情?

【讨论】:

  • 发布这个答案让我觉得我们必须结束这个问题,因为它太宽泛了。这个答案不是一个答案,因为它没有给出标题中提出的问题的解决方案——如何计算重复项。但在这一点上,学生并不需要得到解决方案。他们需要学习如何以各种方式使用代码,以及如何思考问题及其解决方案。这就是这个答案的目的,但这不是 Stack Overflow 的目的。
  • 非常感谢,等我冷静下来就知道了,
【解决方案3】:

如果您不想对数组进行排序并且不想使用任何哈希映射。 这是解决方案:

int dup(int a[],int n){
int count=0;
int i=0;
int j=0;
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
        if( a[i]==a[j] && j!=i){
            if(j>i){
                count++;
            }   
            break;
        }
    }
}
return count;

}

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2012-06-09
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2019-04-17
    • 2017-10-13
    • 2020-04-23
    相关资源
    最近更新 更多