0

给定一个列表和一个数字 k,反转前 k 个元素并保留接下来的 k 个元素。在整个列表中重复此操作。通过反转我的意思是,改变数字的符号。

这是亚马逊的一个面试问题,我在一个网站上遇到过,我试图通过思考如何解决它来解决它,当然我也想知道解决它的最快算法和你的想法。

我想过将数组划分为 K-Steps,然后反转、跳过。然后像合并排序一样合并数组。

4

2 回答 2

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];
于 2013-10-05T13:38:02.577 回答
2

哈桑解决方案的复杂性:

因为你说你认为哈桑的解决方案是 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. 这也是数组中应该修改的元素数。你不能做得比这更好。

于 2013-10-05T13:56:32.553 回答