2016-11-07 48 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] << " "; 
}