【问题标题】:Finding pairs in an array在数组中查找对
【发布时间】:2018-03-13 15:27:27
【问题描述】:

所以我要做的是编写一个代码来查找数组中的一对数字。当只有一对数字时,下面的代码可以完美运行。

#include<stdio.h>
main()
{
    int arr[10], i, j, pairs = 0;
    int n;
    scanf("%d", &n);
    for(i = 0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    for(i = 0; i<n; i++)
    {
        for(j = i+1; j<n; j++)
        {
            if(arr[i] == arr[j])
            {
                pairs++;
            }
        }
    }
    printf("%d", pairs);

}

我想让它在有 3 个相同元素时工作。 例如,arr[5] = 1, 1, 1, 2, 2 它应该返回 2 对(1,1 和 2,2,另外还有 1 个),但它返回 4 对,而不是我的代码!

谢谢。

【问题讨论】:

  • 我建议你先对数组进行排序,然后简单地检查相邻的数字。
  • 我建议您花一些时间阅读 Eric Lippert 的 How to debug small programs,并了解如何使用调试器逐行执行您的代码。我还建议您花更多时间尝试用纸笔评估您的算法,并在尝试编写代码之前先尝试想出一些可能会更好的方法。
  • 建议的输入数据确实有4对。
  • 当然:1,1,1,3对。 1,x,1,然后是 1,1,x,然后是 x,1,1 使用您的算法,因为在计算时您没有消除。
  • 1) 一对应该由两个连续的元素组成吗? 2) 一个元素只能成对使用吗?

标签: c


【解决方案1】:
#include<stdio.h>
main()
{
    int arr[10], i, j, pairs = 0;
    int n;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    bubbleSort(arr,n);

    for(i = 0; i < n-1; i++)
    {
        if(arr[i] == arr[i+1])
        {
            pairs++;
            /*Skip the paired index*/
            i++;
        }
    }
    printf("%d", pairs);
}

【讨论】:

    【解决方案2】:

    在这里,您将每个元素与其他元素一一进行比较,这就是您得到答案为 4 的原因。

    要计算三个或三个以上的对,一种方法可能是对数组进行排序,然后计算该元素出现的次数,如果频率大于 2,则意味着它形成一对。 这是修改后的代码:

    #include<stdio.h>
    main()
    {
        int arr[10], i, j, pairs = 0,count=0,prev_element=0;
        int n;
        scanf("%d", &n);
        for(i = 0; i<n; i++)
        {
            scanf("%d", &arr[i]);
        }
    
        // You need to sort the array here.
    
        prev_element = arr[0];
        count=1;
        for(i = 1; i<n; i++)
        {
            if(prev_element==arr[i])
            {
                count++;
            }
            else
            {
                if(count>=2)
                    pairs+=count/2;
                else
                {
                    prev_element=arr[i];
                    count=1;
                }
            }
        }
        printf("%d", pairs);
    }
    

    而且这也会降低代码的时间复杂度。之前的时间复杂度是 O(n2),现在也变成了 O(n)。

    这里,首先计算每个元素出现的次数,如果出现次数大于两次,则该元素将形成一对,否则不成对。

    【讨论】:

    • 如果我输入 51 2 3 4 1 这个代码打印 0 这似乎是错误的
    • 处理前需要对数组进行排序。而且 1 1 1 1 应该给出 2 对,但代码只会报告 1。
    • 这个程序只适用于上面提到的输出。如果数组是1 1 1 2 2 3 3,它会给出错误的输出
    • 谢谢,我已经进行了更改,现在代码应该可以正常工作了。
    • 我应该补充一点,如果正确实施,排序数组也是最快的方法。 OP 的方式是 n^2,如果你对数组进行排序,你是 n log (n) + n 用于遍历数组,归结为 n log (n)。
    【解决方案3】:

    您必须跟踪比较和计数的配对。否则,这些对可能会被计算多次。

    以下代码工作正常。谢谢。

    #include<stdio.h>
    main()
    {
        int arr[10], check[10], i, j, pairs = 0;
        int n;
        scanf("%d", &n);
        for(i = 0; i<n; i++)
        {
            scanf("%d", &arr[i]);
            check[i]    =   0;
        }
        for(i = 0; i<n; i++)
        {
            for(j = i+1; j<n; j++)
            {
                if(arr[i] == arr[j] && check[j] ==  0   &&  check[i]    ==  0)
                {
                    pairs++;
                    check[j]    =   1;
                    check[i]    =   1;
                }
            }
        }
        printf("%d", pairs);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多