查找数组中具有给定差异的元素

时间:2019-05-18 00:08:19

标签: c arrays

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. 第一个有效索引丢失。在我的代码中,输出缺少给定数组的索引1(即元素219)。如何解决该问题?当前,它基于变量J。

  2. 我无法使代码在数组大小或循环号方面通用且灵活。

例如,如果您查看:

:: for(int i = 0; i <4; i ++) avg / = 4;

第47行第6行:: arr [6]

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

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

我的代码的副本以及行号可以在https://repl.it/repls/SuburbanRelevantDisassembly

中找到

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

预先感谢

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我注意到了几件事:

  1. 您应该查看差异的绝对值,否则输入内容中的数字顺序将包含不应该包含的值。例如,30-200 = -170且-170小于7。只需将 $ echo a\nb anb 更改为(a[j] - a[i])

  2. 我认为您应该同时包括差异比较中的两个数字。如果比较abs(a[j] - a[i])220,并且它们之间的差在范围内,则在重复删除之前,都希望它们都出现在输出中。

更改

221

index[res] = j;
res++;
  1. 在重复检查中,您正在比较输入数组(在差异检查期间填充)中的索引而不是实际数字。如果两次在您的输入中包含相同的数字,将导致问题。由于index[res] = j; res++; index[res] = i; res++; index[j] == index[i]

  2. 的索引数组,因此请执行a[index[j]] == a[index[i]]而不是index
  3. 至于硬编码长度和其他内容,您应该使用初始输入数组的大小。查看动态内存分配(amalloc),以创建运行时确定长度的数组。

这可能不是全部,但希望能帮助您入门。