ASH前段时间贴出了一个问题: 对于有K个元素的数组 int a[K]={....};写一个高效算法将数组内容循环左移m位 比如: int a[6] ={1,2,3,4,5,6} ,循环左移3位得到结果{456123}, 要求: 1不允许另外申请数组空间,但可以申请少许变量 2不允许采用每次左移 这是一个有趣的问题,当时ASH给出了一个很简单的解法: 1、将整个数组倒排; 2、将前k-m个元素和剩下的m个元素分别倒排。 这个算法需要对每个数组元素做两次写操作,所以我当时在考虑,有没有一种方法,只对数组元素进行一次写操作就完成移动? 最直观的想法,就是从第一个元素开始,把它一步移动到最终的目的位置,而该位置原有的元素的值取出,移动到它的新位置。递归进行这个步骤。 首先,我们在数学上很容易理解,这是一个一一对应的映射,绝不会在一个位置上出现两次移动。所以不会出现移动的递归过程中途指向了已经移动过的元素。 那么,这个递归过程唯一的终止条件就是,当前移动的元素,目的位置是移动过程的起始位置。 有兴趣的朋友不妨在纸上推演一下这个过程,并不复杂。多试验几种组合,细心的朋友也许会发现,这个递归过程有时候可以遍历整个数组,有时候则会跳过若干元素。这其中有没有什么规律? 如果按照元素的索引下标标示元素,0到k-1中的任意元素i,会移动到什么位置? 如果i小于m,它会移动到k-m+i,否则