本地机器上的 C 代码很好,但算法热身练习中 hackerrank 的运行时错误"angry children"?



我用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()。效率更高,而且不太容易出错。您必须调整代码以使用基于零的索引,但无论如何都应该这样做,真的。

最新更新