我有一个C ++程序,其中我必须根据要旋转的给定元素数(x)顺时针旋转数组。例如,如果输入数组是
[1,2,3,4,5]
鉴于必须旋转2个元素(表示为x)。
输出数组应该是
[3,4,5,1,2]
代码:
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,x;
cin>>n>>x;
int a[n],b[x];
for(int i=0;i<n;i++){
cin>>a[i];
}
copy(a,a+x,b);
copy(b,b+x,a+n);
n=n+x;
for(int i=x;i<n;i++){
cout<<a[i]<<" ";
}
}
return 0;
}
我在这里所做的是将给定数量的元素复制到新数组中。以后将它们复制回从'n'开始的原始数组。所以我的数组看起来像[1,2,3,4,5,1,2]。
稍后,我将从索引'x'开始打印数组。这样我的数组将看起来像[3,4,5,1,2]。
我能够编译程序,并且得到输出。但是,当在名为GeekforGeeks的网站上提交代码时,其编译器抛出了Segmentation Fault(SIGSEGV)。
答案 0 :(得分:3)
此
int a[n],b[x];
不是标准的c ++。有关详细信息,请参见此处:Why aren't variable-length arrays part of the C++ standard?。将std::vector
用于动态数组。
然后在这里:
copy(a,a+x,b);
您使用x
,但是您用于a
的大小是n
而不是x
。根据您的输入,这可能会超出阵列的边界。
下一步,在这里:
copy(b,b+x,a+n);
您尝试复制到a+n
,但是a+n
已经超出了a
的最后一个元素。数组的大小固定,n=n+x;
也无济于事。
要旋转数组(或std::vector
)的元素,可以使用std::rotate
。
答案 1 :(得分:0)
行
copy(a,a+x,b);
不做您想做的事。它将x
的前a
个元素复制到b
,没有偏移量。如果x
为2,则等同于:
b[0] = a[0];
b[1] = b[1];
您需要执行以下操作:
b[0+x] = a[0];
b[1+x] = a[1];
...
b[n] = a[n-x-1];
要实现此目的,您需要使用:
std::copy(a, a+(n-x), b+x);
行
copy(b,b+x,a+n);
不对。
您要从a
复制到b
,而不是从b
复制到a
。
立即使用a+n
将导致使用越界索引访问数组,这将导致未定义的行为。
该调用中使用的偏移量根本没有意义。
执行std::copy
的第一行之后,您需要执行以下操作:
b[0] = a[n-x];
b[1] = a[n-x+1];
...
b[x-1] = a[n-1];
要实现此目的,您需要使用:
std::copy(a+(n-x), a+n, b);
答案 2 :(得分:-1)
数组必须具有确定的大小 一些编译器接受您的代码,而另一些则不接受 所以尝试改用指针