我在Hackerrank上成功解决了一个问题,并且它通过了所有测试用例,但是我收到错误超时限制。我猜测我是否优化了我的代码它会起作用,但我无法想办法让我的代码更有效率。
问题是: 在大小为n的阵列上的左旋转操作将每个阵列元件1单元向左移位。例如,如果在数组[1,2,3,4,5]上执行了2次左旋转,则数组将变为[3,4,5,1,2]。
给定n个整数和数字d的数组,在数组上执行左旋转。然后将更新的数组打印为一行以空格分隔的整数。
任何人都可以指导我如何提高这段代码的效率吗?
我的代码是:
vector<int> array_left_rotation(vector<int> a, int n, int k) {
for (int j = 0; j < k; j++){
a[n] = a[0];
for (int i = 0; i < n; i++){
a[i] = a[i+1];
}
a[n-1] = a[n];
}
return a;
}
n是数组中元素的数量 k是要执行的旋转次数
答案 0 :(得分:2)
您不需要为此问题实际旋转阵列。公式(i + k) % n
将为数组提供索引i
的元素,该数组已向左旋转k
次。知道了这一点,一旦以这种方式访问每个元素,就可以通过数组:
int main() {
int* arr, n, k, i;
cin >> n >> k;
arr = new int[n];
for (i = 0; i < n; ++i)
cin >> arr[i];
for (i = 0; i < n; ++i)
cout << arr[(i + k) % n] << " ";
}
答案 1 :(得分:0)
尝试执行k旋转,而不是执行k旋转: 一次旋转k左边的整个数组。这样效率更高。
答案 2 :(得分:0)
如果另一个向量不会导致空间问题,您可以使用偏移量复制它们:
//Not tested
vector<int> array_left_rotation(vector<int> a, int n, int k) {
std::vector<int> result(n);
for (int j = 0; j < k; j++){
result[j]=a[(j+k)%n];
}
return result;
}
答案 3 :(得分:0)
using namespace std;
#include<iostream>
int main()
{
int a[1000000],b[1000000];
int n,d;
cin>>n;
cin>>d;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0,j;i<n;i++)
{
if(i==0)
{
j=n-d;
b[j]=a[i];
}
else if(i==d)
{
j=i-d;
b[j]=a[i];
}
else
{
j=(n-d+i);
if(j>n)
{
j=(i-d);
b[j]=a[i];
}
else
{
j=(n-d+i);
b[j]=a[i];
}
}
}
for(int i=0;i<n;i++)
{
cout<<b[i]<<" ";
}
}
这传递了所有测试用例。我实际做的是将数组a[i]
中的每个元素移动到另一个数组b[i]
中k次,因为没有空间约束。