【Leetcode笔记】反转字符串Ⅱ-创新互联

Leetcode原题链接:反转字符串Ⅱ

创新互联是一家集网站建设,保德企业网站建设,保德品牌网站建设,网站定制,保德网站建设报价,网络营销,网络优化,保德网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
一、思路
  • 与反转字符串相比,只是边界条件多了一些,思路基本一致。
  • 一个需要注意的点是这里的字符串确实是字符串,处理前后需要转换数据类型,反转字符串里的字符串是由字符组成的列表。
二、代码 1、个人通过版(原始)

第一遍顺下来写的代码,能通过,但是有不少冗余。

class Solution:
    def reverseStr(self, s: str, k: int) ->str:
        n = len(s)
        fast, slow = -1, -1
        count = 0
        s = list(s)

        while(1):
            left = slow + 1
            if n - count< k:
                right = n - 1
            elif k<= n - count< 2 * k:
                for i in range(k):
                    slow += 1
                    fast += 2
                right = slow
            else:
                for i in range(k):
                    slow += 1
                    fast += 2
                right = slow

            while left< right:
                s[left], s[right] = s[right], s[left]
                left += 1
                right -= 1

            for j in range(k):
                count += 2
            if count >n:
                break
            slow = fast
        
        return ''.join(s)
2、个人通过版(改进)

在 1 的基础上去掉了一些冗余后的版本。

class Solution:
    def reverseStr(self, s: str, k: int) ->str:
        n = len(s)
        p = 0
        s = list(s)

        for count in range(0, n, 2*k):
            left = p
            
            if n - count< k:
                right = n - 1
            else:
                p += k
                right = p - 1

            while left< right:
                s[left], s[right] = s[right], s[left]
                left += 1
                right -= 1

            p += k
        
        return ''.join(s)
3、高手版

运用了一些算是 python 独有的特点,不需要考虑任何边界条件。

class Solution:
    def reverseStr(self, s: str, k: int) ->str:
        """
        1. 使用range(start, end, step)来确定需要调换的初始位置
        2. 对于字符串s = 'abc',如果使用s[0:999] ===>'abc'。字符串末尾如果超过大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
        3. 用切片整体替换,而不是一个个替换.
        """
        def reverse_substring(text):
            left, right = 0, len(text) - 1
            while left< right:
                text[left], text[right] = text[right], text[left]
                left += 1
                right -= 1
            return text
        
        res = list(s)

        for cur in range(0, len(s), 2 * k):
            res[cur: cur + k] = reverse_substring(res[cur: cur + k])
        
        return ''.join(res)
三、温故知新

列表转为字符串的方法。

a = ['h','e','l','l','o']
print(a)
b = ''.join(a)
print(b)

# ['h','e','l','l','o']
# hello

其中join函数可以连接字符串,用法:连接任意数量的字符串(包括要连接的元素字符串、元组、列表、字典),用新的目标分隔符连接,返回新的字符串。
举例如下:

## 字符串:
';'.join('abc') 
# 输出结果为:'a;b;c'  
string1 = 'good idea'#定义字符串
' '.join(string1) 
# 输出结果:'g o o d   i d e a' 
 
#说明:由于字符串里没指明按字符串之间是怎么连接的,默认每个字符之间插入目标字符


# 元组:
tuple1 = ('a','b','c')  #定义元组tuple1
'、'.join(tuple1)
# 输出结果:'a、b、c'
tuple2 = ('hello','peace','world')  #定义元组tuple2
' '.join(tuple2)
# 输出结果:'hello peace world'


# 列表
b = ['a','b','c'] #定义列表
'、'.join(b)
# 输出结果:'a、b、c'
list1 = ['hello','peace','world'] #定义列表
' '.join(list1)
# 输出结果:'hello peace world'


## 字典:
c={'hello':1,'world':2}
';'.join(c)
# 输出结果:'hello;world'
d = {'hello':'hi','world':'2'}
' '.join(d)
# 输出结果:'hello world'

部分内容参考代码随想录、python的join函数的用法及实例

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:【Leetcode笔记】反转字符串Ⅱ-创新互联
文章源于:http://ybzwz.com/article/dcpgsh.html