c-阵列旋转的运行时错误



下面的代码应该将数组A旋转B个位置。

例如,

A:[1 2 3 4 5 6]
B:1

输出:

[2 3 4 5 6 1]

我的代码是

(我只是一个初学者,因此代码如此复杂(

int* rotateArray(int* A, int n1, int B, int *len)
{
int *ret = (int *)malloc(n1 * sizeof(int));
*len = n1;
int i=0;
int J=0;
int t=0;
t=(i+B)%n1;
if((i+B)>=n1)
{
for(i=t;i<n1;i++)
{
ret[J]=A[i];
J++;
}
for(i=0;i<n1;i++)
{
ret[J]=A[i];
J++;
}
return ret;
}
else
{
J=0;
for (i = 0; i < n1; i++) 
{
if((i+B)<n1)
{
ret[i] = A[i + B];
}
else
{
ret[i]=A[J];
J++;
}
}
return ret;
}
}

我遇到运行时错误运行时错误。由于运行时错误,您的提交已停止。例如:除以零,数组索引越界,未捕获异常您可以尝试使用自定义输入测试代码,并尝试在代码中放入调试语句。

*中有错误`/解决方案':free((:无效的下一个大小(快速(:0x00000000009640a0*

中止

您的提交遇到以下输入的运行时错误:

A:[14,5,14,34,42,63,17,25,39,61,97,55,33,96,62,32,98,77,35]

B:56

此测试用例的预期输出为:

35 14 5 14 34 42 63 17 25 39 61 97 55 33 96 62 32 98 77

我不知道为什么!我的所有测试用例都是正确的

您在第二个for循环中循环太多,并且写入超过了分配的输出数组的末尾(因为您总是递增J(。所以改变

if((i+B)>=n1)
{
for(i=t;i<n1;i++)
{
ret[J]=A[i];
J++;
}
for(i=0;i<n1;i++)
{
ret[J]=A[i];
J++;
}
return ret;
}

将:

if((i+B)>=n1)
{
for(i=t;i<n1;i++)
{
ret[J]=A[i];
J++;
}
for(i=0;i<t;i++) // ichanged the stop condition here from i<n1 to i<t
{
ret[J]=A[i];
J++;
}
return ret;
}

您的代码似乎比需要的要长。这应该足够了:

int * rotate(const int * A, int steps, int len)
{
int *ret = malloc(steps * sizeof *ret);
int i;
for(i=0; i<len; i++) {
int pos = i-steps;
if(pos < 0)
pos+=len;
ret[pos]=A[i];
}
return ret;
}

我删除了一个参数,因为您所做的只是将它分配给另一个参数的值。

最新更新