Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Hackerrank已超过时间限制_C++_Arrays_Performance_Optimization - Fatal编程技术网

C++ Hackerrank已超过时间限制

C++ Hackerrank已超过时间限制,c++,arrays,performance,optimization,C++,Arrays,Performance,Optimization,我成功地解决了Hackerrank上的一个问题,它通过了所有测试用例,但我得到了一个超过错误时间限制的错误。我猜如果我优化我的代码,它会工作,但我想不出任何方法使我的代码更有效 问题是: 对大小为n的数组执行左旋转操作会将数组的每个元素向左移动1个单位。例如,如果对数组[1,2,3,4,5]执行两次左旋转,则该数组将变为[3,4,5,1,2] 给定一个由n个整数和一个数字d组成的数组,在该数组上执行d次左旋转。然后将更新后的数组打印为一行空格分隔的整数 有谁能告诉我如何使这段代码更有效 我的代码

我成功地解决了Hackerrank上的一个问题,它通过了所有测试用例,但我得到了一个超过错误时间限制的错误。我猜如果我优化我的代码,它会工作,但我想不出任何方法使我的代码更有效

问题是: 对大小为n的数组执行左旋转操作会将数组的每个元素向左移动1个单位。例如,如果对数组[1,2,3,4,5]执行两次左旋转,则该数组将变为[3,4,5,1,2]

给定一个由n个整数和一个数字d组成的数组,在该数组上执行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;
}
向量数组左旋转(向量a,int n,int k){
对于(int j=0;j
n是数组中的元素数
k是要执行的旋转数

请尝试执行k旋转,而不是执行k旋转:
一次性将整个阵列向左旋转k。这样效率更高。

如果另一个向量不会引起空间问题,您可以使用偏移量复制它们:

//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;
}
//未测试
向量数组左旋转(向量a,int n,int k){
std::向量结果(n);
对于(int j=0;j
对于此问题,不需要实际旋转阵列。公式
(i+k)%n
将给出向左旋转
k
次的数组中索引
i
处的元素。知道这一点后,您可以通过以下方式访问每个元素:

intmain(){
int*arr,n,k,i;
cin>>n>>k;
arr=新整数[n];
对于(i=0;i>arr[i];
对于(i=0;i使用名称空间std;
#包括
int main()
{
INTA[1000000],b[1000000];
int n,d;
cin>>n;
cin>>d;
对于(int i=0;i>a[i];
}
对于(int i=0,j;in)
{
j=(i-d);
b[j]=a[i];
}
其他的
{
j=(n-d+i);
b[j]=a[i];
}
} 
}

对于(int i=0;iuse?请不要在此处询问有关在线代码判断引擎的问题。任何人都不太可能告诉您他们的测试用例失败的地方,因为这些测试用例通常不会公开。即使您测试的是在您的本地环境中运行的,您也可能错过了测试在线代码判断引擎中应用的一些边缘用例llenge.要有创意,并努力找到它们。此外,从长远来看,这类问题可能没有任何价值,除了作弊在线比赛,而且什么也学不到。你只需将数组从
d
位置打印到
n
位置,然后从
0
位置打印到
d
位置,这样你就不需要旋转数组了什么?你不需要做旋转,你可以用数学。在给定的
d
n
范围内,你的方法将复制1000000000个整数。这可能需要一段时间。
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]<<" ";
    }
}