2016-11-07 96 views
-2

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

现在的问题是: 大小为n的数组的左旋转操作会将阵列的每个元素向左移动1个单位。例如,如果在数组[1,2,3,4,5]上执行2次左旋转,则数组将变为[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; 
} 

n是在阵列 k个元素的数量将要执行

+6

使用[ ? – NathanOliver

+3

请在此处不要询问关于在线代码判断引擎的问题。任何人都不可能告诉你自己的测试用例失败,因为这些通常都没有披露。即使您测试的是在您的本地环境中运行,您可能错过了测试在线挑战中应用的一些边缘案例。有创意并尝试找到它们。此外,长期来看,这些问题可能没有任何价值,除了欺骗在线竞赛之外,没有任何东西可以学到。 –

+1

那么你怎么打印数组从'd'到'n',然后从'0'到'd',所以你实际上不需要旋转任何东西? – nwp

回答

0

转数而不是执行ķ转,尝试执行的k旋转: 一次将整个数组左移k。这效率更高。

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; 
} 
0

你并不需要真正转动这个问题的阵列。公式(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] << " "; 
}