我在 hackerrank 的算法部分为问题“愤怒的 child ”上传了一个 c 代码。对于测试用例 #2,它显示运行时错误,而在我的本地机器(ubuntu 14.04,x86)上,在 gcc 中它给出答案 1335,根据他们给出的测试用例 #2 输出,这是正确的答案。请告诉我如何使 hackerrank 完美地接受我的代码,它适用于所有其他测试用例。
#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("%lld\n",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("%lld\n",min);
return 0;
}
这是我的 c 代码,请告诉我为什么它在 hackerrank 编译器上出现段错误?
最佳答案
你的插入排序函数有一个错误,它不会检查 j
是否小于 1。尝试在列表的开头插入一个值。
修复很简单。只是改变
while(ar[j-1]>v){
到
while(j>1 && ar[j-1]>v){
或者,不是重新发明轮子,而是使用 stdlib
中提供的库函数之一,例如 qsort()
。效率更高,更不容易出错。您必须调整代码以使用从零开始的索引,但是 you should be doing that anyway, really .
关于本地计算机上的 c 代码很好,但算法预热练习 "angry children"中 hackerrank 的运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25918260/