我有一个像{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.不应删除重复的元素。否则,它可能会影响平均部分。
给出数组:{30,219,220,221,216,220};
差= 9; 我正在寻找以整数形式返回的平均值219,220,221,216,220,即219。
我正在做的是首先找到符合条件的元素的索引。然后删除重复的索引,然后取平均值。
我在不同页面上找到的示例的帮助下编写了以下代码,但是存在一些问题。
#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;
}
此代码有两个问题:
第一个有效索引丢失。在我的代码中,输出缺少给定数组的索引1(即元素219)。如何解决该问题?当前,它基于变量J。
我无法使代码在数组大小或循环号方面通用且灵活。
例如,如果您查看:
:: 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
期待您的帮助/建议。还是相比于此,您是否建议更好的解决方案?
预先感谢
答案 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)
我注意到了几件事:
您应该查看差异的绝对值,否则输入内容中的数字顺序将包含不应该包含的值。例如,30-200 = -170且-170小于7。只需将 $ echo a\nb
anb
更改为(a[j] - a[i])
。
我认为您应该同时包括差异比较中的两个数字。如果比较abs(a[j] - a[i])
和220
,并且它们之间的差在范围内,则在重复删除之前,都希望它们都出现在输出中。
更改
221
到
index[res] = j;
res++;
在重复检查中,您正在比较输入数组(在差异检查期间填充)中的索引而不是实际数字。如果两次在您的输入中包含相同的数字,将导致问题。由于index[res] = j;
res++;
index[res] = i;
res++;
是index[j] == index[i]
a[index[j]] == a[index[i]]
而不是index
至于硬编码长度和其他内容,您应该使用初始输入数组的大小。查看动态内存分配(a
和malloc
),以创建运行时确定长度的数组。
这可能不是全部,但希望能帮助您入门。