【发布时间】: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,即元素 219。我该如何解决?目前它基于变量J。
-
我无法使代码在数组大小或循环数方面通用且灵活。
例如,如果您查看:
第 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
期待您的帮助/建议。或者你有没有比这更好的解决方案?
提前致谢
【问题讨论】: