怎么用c语言编程实现下述函数功能接口,跪求大佬
int getMostJumps(int *inputArray,int n,int *outputIndexArray,int m); 输入: n个不小于0的整数,(n为动态可变),输出:相邻两个数字的变化的绝对值,按照从大到小的降序排列, 输出前m 个变化最大的位标,(m 为动态参数),如果有相同的变化大小,则从位标从小到大来排列,如果 相邻数字变化的个数小于m个,则输出 实际的个数。函数返回值为 输出的数列的个数。 例如:int inputArray[20]={5, 10, 18, 9, 12, 18, 9, 20,25,22,15,18,9,20,40,42,30,33,33,55};那么相邻的变化 为{5,8,-9,3,6,-9,11,5,-3,-7,3,-9,11,20,2,-12,3,0,22};假设outputArray指向一个大于m 的数组,则 调用 getMostJumps(inputArray,20,outputArray,5),应该返回5,outputArray 将被填充为:{18,13,15,6,12}
纯算法的问题,有点小复杂 ,以下是我写的程序参考
#include <stdio.h> #include <stdlib.h> int sort_function( const void *a, const void *b) { return *(int *)b-*(int *)a; } int findpos(int *p,int k,int n) { int i; for(i=0; i<n; i++) if(p[i]==k) { p[i]=-1; break; } return i; } int getMostJumps(int *inputArray,int n,int *outputIndexArray,int m) { int i,j; int *temp,*temp1; temp=(int *)malloc(n*sizeof(int)); temp1=(int *)malloc(n*sizeof(int)); for(i=1; i<n; i++) { temp[i-1]=inputArray[i]-inputArray[i-1]; if (temp[i-1]<0) temp[i-1]=-temp[i-1]; temp1[i-1]=temp[i-1]; } qsort(temp,n-1,sizeof(int), sort_function); if (n-1<m) m=n-1; for(i=0; i<m; i++) outputIndexArray[i]=findpos(temp1,temp[i],n-1); free(temp); free(temp1); return m; } int main() { int i, m; int inputArray[20]= //{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} ; {5, 10, 18, 9, 12, 18, 9, 20,25,22,15,18,9,20,40,42,30,33,33,55}; int outputArray[5]; m=getMostJumps(inputArray,20,outputArray,5); for(i=0; i<m; i++) printf("%d ",outputArray[i]); printf(" "); }
我的测试结果
符合你的要求,只是
***如果 相邻数字变化的个数小于m个,则输出 实际的个数。
这个变化个数我理解是可以重复的,否则如
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
这样的数据,只有一个输出了
下一篇:如何让虚拟机防止被检测出来
上一篇:使用mp3gain时总是出现问题