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

标签 c

我在 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/

相关文章:

c - 我的C程序中的内存分配问题

c - 在文件描述符上使用 fwrite/将文件描述符转换为文件指针

c - 来自 C 程序的 Gnuplot - 只允许对超过一定长度的文件进行绘图

c - UDP 客户端/服务器 block

c - e1 && e2 是否等同于 e2 && e1?

c - 使用 UNIX 套接字 "zero-length datagrams"的原因是什么?

C - 用户输入数字的所有数字组合

c - 结构的不完整类型错误

CUDA 矩阵乘法写入错误的内存位置

android - 在 .so 中混合使用 c/c++ 和程序集时避免文本重定位