https://leetcode.com/articles/rotate-array/
Silu
- Extra Array
- 笨了,直接一个for循环就可以搞定的 我是不是傻啊
- Cyclic Replacement
- 之前想过, 比如长度为n = 8, k = 3. 如果换的话,应该是位置n - k -> 0 -> 3 -> 6 = n - k + 1 所以貌似找不到规律.
- 但仔细想想,我忽视了一个细节,也就是后移的时候总是隔了k个,即便到达了array的tail,只要从头开始计算就可以了.也就是说要用
(i + k)%len
来确定下一个的位置.- 于是就每个数字往后移动k位 一共移动n次不就完了吗?
- 不对
- 如果n%k 比如n = 6, k = 2 那么就会一直循环n[4], n[2]. n[0]这三个变换. 所以一旦检测到同一个位置变换,就需要手动 移动到下一个位置
- 以上的理解还不够深入,因为比如从起始位置i开始,替换第i+ k个元素,在经过<= n次跳动之后,终究会回到i上来. 如果k可以被n整除,那么n/k次之后就会回到i上, 如果不被整除,则跳动n次后会到i
- 写好之后,发现当k = 0的时候,初始的len-0+i会导致nums[len]溢出了. 这个时候应该想到,这种情况应该用mod len 就可以有效的把溢出变为0
- Reverse
- Reverse的优点是节省空间, 直接循环一般前后调换即可. 这个想法很聪明啊! 自己想不到啊!
- 在写helper reverseArray()的时候, 最初只打算传一个参数 int[] 后来发现这样聪明, 可以把reverse的那部分通过起止index都传进去. 主函数就不用生成新的array了. 而根据reverse的算法, reverse部分和reverse全部是类似的.
- 提示: 我的helper用的是返回数组, 也可以直接在原nums上修改,
Failed Cases
- [1, 2, 3] k = 1
- [1] k = 2;
- [1] k = 0;
- [1] k = 1;