2013-10-05 30 views
0

給定一個列表和一個數字k,倒置第k個元素並留下下一個k元素。在整個列表中重複這一點。通過反轉我的意思是,改變數字的符號。顛倒數字列表並跳過其他數字

這是一個在亞馬遜的採訪問題,我在網站上看到的,我試圖通過思考如何解決它,確定我也想知道解決它的最快算法和你的想法。

我想過把數組分成K-Steps,然後倒置,跳過。然後像合併排序一樣合併數組。

+0

什麼反轉意味着? – hasan83

+0

更改數字的符號 –

+0

@iccthedral還有什麼其他解決方法:)?更好的複雜性? –

回答

2
for (int i=0;i<size;i+=k*2) 
    for (int j=0;j<k&&i+j<size;j++) 
     arr[i+j]=-arr[i+j]; 

如果你確定陣尺寸爲2 * k倍或等於x * 2 * K - k,則:

for (int i=0;i<size;i+=k*2) 
    for (int j=0;j<k;j++) 
     arr[i+j]=-arr[i+j]; 
+0

認爲比這更簡單嗎? – hasan83

+0

爲什麼乘法而不是一元否定? – pjs

+0

我已驗證此解決方案,它的工作原理。 –

2

複雜哈桑的溶液:

因爲你說你認爲hasan的解決方案是O(N^2),所以我想解釋你爲什麼錯了。因此,他建議:

for (int i=0; i < size; i+=k*2) 
    for (int j=0; j < k && i+j < size; j++) 
     arr[i+j] = -arr[i+j]; 

迭代的第一個循環數爲size/(k * 2)和迭代的第二循環的數量是k。 Hense,迭代總次數爲size/2。這也是應該修改的數組中元素的數量。你做不到比這更好。

+0

你可以做得比這更好。量子計算機上的複雜性是O(1)。 –

+0

我假設馮諾依曼機器或類似的:)。你也可以用FPGA和固定大小做得更好。 –