1.rotate操作实际上可以看作是左移操作。比如要求将一个序列的前m个元素和后面的元素交换位置,其实相当于将所有元素左移m位,如果移到了头,就自动跳到尾部接着移。
2.于是有这样一种算法,先让第 i i i位元素等于第 i + m i+m i+m位,然后让第 i + m i+m i+m位元素等于第 i + 2 ∗ m i+2*m i+2∗m位元素。当然这里要使用模操作来应对数组越界。这样就相当于元素左移m位了。
3.但是这样有一个问题,比如对于[a, b, c, d, e, f]
,要求将所有元素左移两位。我们从 i = 0 i=0 i=0开始,然后 i i i跳到2,再然后跳到4,然后就又跳回了0。经过2所示的过程,我们只是将a
、c
、e
放到了正确的位置,而b
、d
、f
都没被操作过。
4.有这样一条数学定理,如果n和m的最大公因数是d,那么序列 0 % n 0\% n 0%