Array189RotateArray

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值