LeetCode 1427. 字符串的左右移题解思路,不明白为啥是simple

解题思路
就好比压路机,向前开和向后开,其实接触到地面的部分都是负重轮下面的那几节履带,看最后哪几节履带接触到地面。

假设最开始压路机履带上面印着如下字母: oyohimoy
                                                                  m ⊙⊙⊙⊙ o
                                                                      i ⊙⊙⊙ h
                                                                        hoyomi

那么最开始碾压的便是hoyomi。

当压路机向前行进或者向后倒退,履带转了无数圈,mihoyo(strlen := len(str)=6)被无数次碾压,假设最后停留的几个字母为mihoyo,其实就相当于向前行进了5个字母(strlen+step(5)),或者相当于倒退了(strlen+step(-1)),假设两个履带长度为mihoyo拼接一块,即mihoyomihoyo(strlen=12),其中接地长度为6。

那么假设起始点为拼接点m字符处,***向前(左移),***向后(右移),接地(截取)omihoy到接地(截取)mihoyo,即可表现所有状态
([-5,1],[-4,2],[-3,3],[-2,4],[-1,5],[0,6])

那么,抽象化为切片,拼接之后,截取所需位置返回即可,代码如下:

代码

func stringShift(s string, shift [][]int) string {
    step := 0
    strlen := len(s)
    for _,v1 := range shift{
        if (v1[0] == 0){
            step += v1[1] 
        } else {
            step -= v1[1]
        }
    }
    step = step%strlen

    if (step < 0){
        return  string([]byte((s+s)[strlen+step:strlen*2+step]))
    } else if (step == 0){
        return s
    } else {
        return  string([]byte((s+s)[step:strlen+step]))
    }
}
如果不给我出纳西妲满命,那么就让mihoyo无数次被送去二次元吧,这可是赌上游戏生涯的700抽
<( ̄ ﹌  ̄)>   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值