zoukankan      html  css  js  c++  java
  • 0541-leetcode算法实现之反转字符串II-reverseStrII-python&golang实现

    给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

    如果剩余字符少于 k 个,则将剩余字符全部反转。
    如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    示例 1:

    输入:s = "abcdefg", k = 2
    输出:"bacdfeg"
    示例 2:

    输入:s = "abcd", k = 2
    输出:"bacd"

    提示:

    1 <= s.length <= 104
    s 仅由小写英文组成
    1 <= k <= 104

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-string-ii

    python

    # 反转字符串1
    def reverse(s_list, l, r):
        """
        反转列表,左右指针交换元素,相遇停止
        :param s_list:
        :param l:
        :param r:
        :return:
        """
        while l < r:
            temp = s_list[l]
            s_list[l] = s_list[r]
            s_list[r] = temp
            l += 1
            r -= 1
    
    class Solution:
        def reverseStrII(self, s: str, k: int):
            """
            双指针法, 时间O(n), 空间O(n) -> s>list, O(n)空间
            :param s:
            :param k:
            :return:
            """
            s_list = list(s) # 字符串在py中属于不可变类型,转成list操作
            n = len(s_list)
            for l in range(0, n-1, 2*k): # 间隔2k
                r = l + k -1 # 右指针,需要反转的右指针位置
                r = r if r < n-1 else n-1 # 右指针取小值,即当r<n-1时,反转前k个字符,反之全部反转
                reverse(s_list, l, r)
                # reverse(s_list, l, min(r, n-1)) 上述简化
            return ''.join(s_list) # 转回字符串输出
    
    if __name__ == "__main__":
        s = 'legendABC'
        k = 3
        test = Solution()
        print(test.reverseStrII(s, k))
    

    golang

    package main
    
    import "fmt"
    
    func main() {
    	s := "lengendABC"
    	k := 3
    	fmt.Println(reverseStrII(s, k))
    }
    
    func reverseStrII(s string, k int) string {
    	t := []byte(s)
    	n := len(t)
    	for l := 0; l < n-1; l += 2 * k {
    		r := l + k - 1
    		reverse(t, l, min(r, n-1))
    	}
    	return string(t)
    }
    
    func reverse(ss []byte, l, r int) {
    	for l < r {
    		ss[l] ^= ss[r]
    		ss[r] ^= ss[l]
    		ss[l] ^= ss[r]
    		l++
    		r--
    	}
    }
    
    func min(a, b int) int {
    	if a < b {
    		return a
    	}
    	return b
    }
    
  • 相关阅读:
    brctl 使用说明
    Flash文件系统介绍和平台采用squashfs+ubifs原因
    xargs
    svn的常用命令
    shell中的if用法
    shell中单双引号
    删除文件中的 ^M 字符
    博客园添加live2d看板娘
    IOS 自定义转场动画
    rails
  • 原文地址:https://www.cnblogs.com/davis12/p/15463470.html
Copyright © 2011-2022 走看看