我们已经给出了一个大小为n的数组,我们必须将其旋转k次,其中k在某些情况下可以大于n。
我的努力-
#include<iostream>
using namespace std;
void inputarray(int arr[],int size){
for(int i=0;i<size;i++){
cin>>arr[i];
}
}
int main(){
int n;
cin>>n;
int arr[100];
inputarray(arr,n);
int ansarr[n];
int k;
cin>>k;
k = k%n;
int j=0;
for(int i =n-k;i<n;i++){
ansarr[j++] = arr[i];
}
for(int i=0;i<=k;i++){
ansarr[j++]=arr[i];
}
for(int i=0;i<n;i++){
cout<<ansarr[i];
}
}
我的输出在k〉2时是正确的,就像k = 3时的输出是-
6
1 2 3 4 5 6
3
456123
这是正确的,但是对于k〈2,比如k = 2,1和0,我的输出是不正确的。
6
1 2 3 4 5 6
2
561234199699
所以我哪里做错了,有人能告诉我吗?
3条答案
按热度按时间y53ybaqx1#
您可以使用单个循环执行旋转,这是完全安全的,使用
现在你可以去掉循环中的模,注意到
i + k
仍然在[0, n)
中,i
在[- k, n - k)
中,因此在[0, n - k)
中,i + k - n
仍然在[0, n)
中,i
在[n - k, 2n - k)
中,因此在[n - k, n)
中。注意:由于操作符
%
的行为,上面的代码对于k < 0
将失败。xbp102n02#
对于初学者,请注意这样的可变长度数组
不是标准的C++功能。您应该像声明数组
arr
那样声明该数组或者,您可以使用标准容器
std::vector
来代替数组。无论如何你的代码都是错误的至少因为这个for循环
应从等于
k
的i
开始,而不是从i = n - k
开始相应地第二个for循环应该是
也就是说,循环的条件应该类似于
i < k
。您的程序适用于
k
等于3
的情况,因为当n
等于6
时,表达式n - k
会产生相同的值3
。请记住,您可以使用在头文件
<algorithm>
中声明的标准算法std::reverse_copy
。这是一个演示程序
程序输出为
至于你的for循环方法,那么只使用一个for循环就足够了。
程序输出与上图相同
velaa5lx3#
我不知道问题描述或当前答案是如何“rotate it by k times”的,其中“it”是给予数组,它们似乎都创建了一个新数组。
若要将数组循环k次,首先取k对数组长度取模,然后执行三个步骤(例如,
{1, 2, 3, 4, 5}, k = 3
):反转零件直到索引k:
将零件从索引k反转到末尾:
反转整个阵列: