我用c语言上传了一段代码,用于解决hackerlink算法部分的"愤怒的孩子"问题。对于测试用例#2,它显示了运行时错误,而在gcc中的本地机器(ubuntu 14.04,x86)上,它根据他们给出的测试用例#2输出给出了正确的答案1335。请告诉我该怎么做才能让hackerbank完全接受我的代码——它适用于所有其他测试用例。
#include<stdio.h>
#include<assert.h>
long long int *insertion(long long int ar[],long long int n)
{
long long int i,j,v;
for(i=2;i<=n;i++)
{
v=ar[i];j=i;
while(ar[j-1]>v){
ar[j]=ar[j-1];j--;
}
ar[j]=v;
}return ar;
}
int main()
{
long long int i,a,b,c,temp;
long long int n,k;
scanf("%lld",&n);
long long int ar[n+1];
assert(1<=n<=100000);
scanf("%lld",&k);
assert(1<=k<=n);
for(i=1;i<=n;i++)
{
scanf("%lld",&ar[i]);
assert(0<= ar[i] <=1000000000);
}
insertion(ar,n);
//for(i=1;i<=n;i++)
//{
// printf("%lldn",ar[i]);}
long long int f,min=9999999999;
for(i=1;i<=n-k+1;i++)
{
f=ar[i+k-1]-ar[i];
if(f<min)
min=f;
}
printf("%lldn",min);
return 0;
}
这是我在c中的代码,请告诉我为什么它在hackerlink编译器上出现分段错误?
插入排序函数中有一个错误,它不会检查j
是否小于1。因此,每当你的代码试图在列表的开头插入一个值时,它就很容易走向荒野。
修复方法很简单。只需更改
while(ar[j-1]>v){
至
while(j>1 && ar[j-1]>v){
或者,代替重新发明轮子,使用stdlib
中提供的库函数之一,例如qsort()
。效率更高,而且不太容易出错。您必须调整代码以使用基于零的索引,但无论如何都应该这样做,真的。