1.总结

1.1。语言:C

我有一个像这样的数组{30,220,219,220,221},我有一个差值,让我们假设9(k = 9)。
我想获得所有小于该差异的整数元素。然后返回这些有效值的平均值。

注意1.数组的大小不是固定的。例如可能是这样的:

{220,219,220,30,216,224,217} //更大的数组大小

或{222,220,219,220,221} //所有值都在差异之内

或{30,66,89,220,221} //更多值超出范围

注2.不应删除重复的元素。否则,它可能会影响平均部分。

1.2。例:

给定数组:{30,219,220,221,216,220};

差异= 9;
我正在寻找以整数形式返回的219,220,221,216,220的平均值,即219。

我正在做的是首先找到合格元素的索引。然后删除索引重复项,然后取平均值。

2.背景

我在不同页面上找到的示例的帮助下编写了以下代码,但是存在一些问题。

3.代码

#include <stdio.h>
#include <math.h>



int countPairs(int a[], int n, int k)
{
  printf( "n is %d \tand\t", n); //debug
  printf( "k is %d\n\n", k); //debug
//////////////////////////////////////// finding indexes ////////////////
//credit: https://www.geeksforgeeks.org/pairs-difference-less-k/
  int index[n*2];
    int res = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {

            if ((a[j] - a[i]) < k) {
                index[res] = j;
                printf("index[%d]= %d,\t", res, index[res]); //debug
                printf("(%d,%d), (%d,%d)\n", i, j, a[i], a[j]); //debug
                res++;
            }
        }
    }
///////////////////////////////////////// removing duplicate indexes //////
// credit: https://www.studytonight.com/c/programs/array/remove-duplicate-element-program
  int i, j, t, m=n*2;
    for (i = 0; i < m; i++)
    {
        for (j = i + 1; j < m; )
        {
            if (index[j] == index[i])
            {
                for (t = j; t < m; t++)
                {
                    index[t] = index[t + 1];
                }
                m--;
            }
            else
            {
                j++;
            }
        }
    }

//////////////////////////////////////////////averaging ///////////
  int arr[6],avg=0;
  for (int i = 0; i <4; i++ ) {
      arr[i]=a[index[i]];
      avg+=arr[i];

      printf( "a[%d] : %d\n", i, arr[i]); //debug

  }
  avg/=4;
  printf( "Average : %d\n", avg); //debug
////////////////////////////////////////////////////////////////
    return avg;
}



int main()
{
    int a[] = {30, 219, 220, 221, 216, 220};
    int k = 9;
    int n = sizeof(a) / sizeof(a[0]);
  /////////////////////////////////
    printf("\nGiven array: {");
    for (int i = 0; i <n; i++ ) {
      printf("%d", a[i]);
      if(i<n-1){
        printf(", ");
      }
    }
    printf("}\n\n");
  /////////////////////////////////
  countPairs(a, n, k);
   ///////////////////////////////

    return 0;
}


4.实际结果,包括任何错误消息

此代码有两个问题:


缺少第一个有效索引。在我的代码中,输出缺少给定数组的索引1(即元素219)。如何解决?当前,它基于变量J。
我无法使代码在数组大小或循环号方面通用且灵活。


例如,如果您查看:

:: in中的第50和57行4表示(int i = 0; i
第47行-6在:: arr [6]中

第24行变量m- in :: :: m = n * 2; //此值不合逻辑,我只是​​基于一个简单的猜测就得出了

:: index [n * 2]中的第9行数组大小; //此数组的大小不合逻辑,我只是​​基于一个简单的猜测就得出了

我的代码的副本,带有行号,可以在以下位置找到:https://repl.it/repls/SuburbanRelevantDisassembly

希望有您的帮助/建议。还是相比于此,您是否建议更好的解决方案?

提前致谢

最佳答案

我不知道我是否完全理解了这个问题,并且在看到代码可以正常工作的时候,但是我进行了更改,看来一切正常。

int countPairs(int a[], int n, int k)
{
  printf( "n is %d \tand\t", n);
  printf( "k is %d\n\n", k);
  int index[n*2];
  int res = 0;

  for (int i=0; i<n; i++){
    for(int j=i+1; j<n; j++){
      if((a[j] - a[i]) < k){
        index[res] = a[i];
        res++;
      }
    }
  }

  int aux = 0;
  for(int i=0; i<res; i++)
    aux = aux + index[i];

  printf("Average: %d", aux/res);
  return aux/res;
}

关于c - 查找数组中具有给定差异的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56194917/

10-09 05:10