问题描述
n=5(数组中的元素数)和 d=4(数组向左旋转的元素数)的值
vector<int> rotateLeft(int d,vector<int> arr)
{
int n=arr.size();
vector<int> temp;
for(int i=0;i<d;i++)
{ temp[i]=arr[i]; }
for(int j=d;j<n;j++)
{ arr[j-d]=arr[j]; }
for(int k=0;k<d;k++)
{ arr[n-d-k]=temp[k];
}
return arr;
}
输入给定 arr[]= 1 2 3 4 5
需要输出arr[]=5 1 2 3 4
解决方法
您得到 Segmentation fault
有两个原因:
- 在使用方括号访问元素之前,您必须调整
temp
的大小以匹配arr
,或者使用std::vector<int> temp(n);
或之后调用temp.resize(n)
。 - 您犯了一个索引错误,导致访问越界:
arr[n-d-k]=temp[k]
实际上应该是arr[n-d+k]=temp[k]
。为了避免这种情况,您可以尝试改用.at(i)
运算符:它执行越界检查。
试试 here。
标准库中还有一个名为 std::rotate
的函数。
std::rotate(arr.begin(),arr.begin() + d,arr.end());
试试 here。
如果我必须快速编写自己的版本,我实际上会做类似的事情
template <typename T>
std::vector<T> rotateLeft(std::vector<T> const& vec,int const d) {
std::size_t const N = vec.size();
std::vector<T> temp;
temp.resize(N);
for (std::size_t i = 0; i < N; ++i) {
std::size_t const new_i = (N + i - d)%N;
temp.at(new_i) = vec.at(i);
}
return temp;
}
试试 here。
,arr[n-d-k]=temp[k];
应该是
arr[n-d+k]=temp[k];