反转数字列表并跳过其他数字

时间:2013-10-05 13:34:23

标签: c++ algorithm

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

这是亚马逊的采访问题,我在一个网站上浏览过,我试图通过思考如何解决它来接近它,确定我也想知道解决它的最快算法和你的想法。

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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。这也是数组中应修改的元素数量。你不能做得更好。