4月30天leetcode训练-Day14

本文详细解析了如何通过遍历矩阵来实现字符串的左移和右移操作,提供了Python代码示例,展示了如何根据移动方向和距离进行字符串的高效位移。

Perform String Shifts

题目描述:给一个字符串和一个矩阵。矩阵中的元素为(移动方向,移动距离)。当移动方向为1时将尾部元素移动到头部,有几个移动距离就依次移动几个尾部元素,类似,当移动方向为0时将头部元素移动到尾部。

Example:

Input: s = "abc", shift = [[0,1],[1,2]]
Output: "cab"
Explanation: 
[0,1] means shift to left by 1. "abc" -> "bca"
[1,2] means shift to right by 2. "bca" -> "cab"
Input: s = "abcdefg", shift = [[1,1],[1,1],[0,2],[1,3]]
Output: "efgabcd"
Explanation:  
[1,1] means shift to right by 1. "abcdefg" -> "gabcdef"
[1,1] means shift to right by 1. "gabcdef" -> "fgabcde"
[0,2] means shift to left by 2. "fgabcde" -> "abcdefg"
[1,3] means shift to right by 3. "abcdefg" -> "efgabcd"

解法:

只需要遍历矩阵,设置一个变量flag表示最后移动的方向及大小:flag初始为0
遍历矩阵中的元组,遇到1,则flag加上移动距离,遇到0则flag减去移动距离。
最后看flag的正负及大小,正则表示向左移动,负则表示向右移动,flag的绝对值表示移动的字符串个数。

0将头添加到最后
1将尾添加到最前

class Solution:
    def stringShift(self, s: str, shift: List[List[int]]) -> str:
        
        flag = 0
        for i in range(len(shift)):
            if shift[i][0] == 1:
                flag += shift[i][1]
            else:
                flag -= shift[i][1]
        print(flag)
        if flag >0:#如果为正,说明1大,说明将后几位添加到前面
            flag = flag % len(s)#有可能出现flag最后大于字符串长度的情况,于是将其对字符串长度取余
            if flag > 0 :
                return s[-flag:] + s[:len(s) - abs(flag)]
            else:#取余后flag只可能是大于等于0,如果等于0,说明不需要移动返回字符串。
                return s
        else:
            flag = abs(flag) % len(s)
            return s[abs(flag):] + s[:abs(flag)]

时间复杂度为O(n),空间复杂度为O(1)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值