【问题标题】:Find elements with a given difference in an array在数组中查找具有给定差异的元素
【发布时间】:2019-05-18 00:08:19
【问题描述】:

1。总结

1.1。语言:C

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

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

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

or {222, 220, 219, 220, 221} // 所有值都在差值范围内

or {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. 我无法使代码在数组大小或循环数方面通用且灵活。

例如,如果您查看:

第 50 行和第 57 行第 4 行 :: for (int i = 0; i 和 avg/=4;

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

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

在 :: index[n*2] 中的第 9 行数组大小; //这个数组大小不合逻辑,我只是​​根据一个简单的猜测做出来的

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

期待您的帮助/建议。或者你有没有比这更好的解决方案?

提前致谢

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    我不知道我是否完全理解了这个问题,并且当看到它工作的代码时,但我进行了更改,它似乎工作正常。

    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.它复制了数组的元素,这会影响平均部分。 2.它不考虑最后一个元素,220。
    【解决方案2】:

    所以我注意到了几件事:

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

    2. 我认为您应该包括差异比较中的两个数字。如果您比较 220221 并且它们的差异在范围内,则您希望在重复删除之前将它们都包含在输出中。

    改变

    index[res] = j;
    res++;
    

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

    2. 至于硬编码长度等等,您应该使用初始输入数组的大小。查看动态内存分配(mallocfree)以创建运行时确定长度的数组。

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

    【讨论】:

    • 感谢约翰的建议。 1. 没错。 2.此解决方案有效,谢谢。 3.我不想删除重复的元素,因为它会影响平均部分。这就是为什么我的代码方式中的重复删除部分应用于索引而不是元素。 4. 我没有得到这部分。如何检索这些循环的有效元素数量?
    • 最好知道如何在此链接repl.it/repls/SuburbanRelevantDisassembly 的第 52 行将变量 q 设置为通用的。这样它就可以处理更大或更小的数组,或者可能有两个元素超出范围的数组,例如{30, 66, 220, 221, 216, 220}。
    猜你喜欢
    • 2016-11-17
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2021-12-18
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多