面试题系列

  1. 经典面试题 之 单链表找环
  2. 经典面试题 之 数组的循环右移
  3. 经典面试题 之 洗牌问题
  4. 经典面试题 之 在单调矩阵中查找元素
  5. 经典面试题 之 按单词逆序
  6. 经典面试题 之 查字典

题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}。

这题最平凡的做法是开另一个大小一样的数组B,遍历一下,令B[(i + m) % n] = A[i],再将B的内容写回到A即可。这个方法的时间复杂度为O(N),空间复杂度也为O(N)。

很明显,需要优化空间的使用。有一种很优美但不太好懂的方法,是先将A的元素倒置,即{1, 2, 3, 4, 5}变成{5, 4, 3, 2, 1},然后将前m位倒置,即{3, 4, 5, 2, 1},再将后n-m位倒置,即{3, 4, 5, 1, 2}。完成。证明略,代码如下:

Continue reading »

© 2004 - 2011 Leona+Suffusion theme by Sayontan Sinha