python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python反转字符串

python反转字符串的七种解法总结

作者:weixin_47868976

这篇文章主要介绍了反转字符串的多种方法,包括双指针、栈结构、range函数、reversed函数、切片、列表推导和reverse()函数,每种方法都有其特点和适用场景,需要的朋友可以参考下

题目难度

简单

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。

示例

示例 1

输入s = ["h","e","l","l","o"]输出["o","l","l","e","h"]

示例 2

输入s = ["H","a","n","n","a","h"]输出["h","a","n","n","a","H"]

提示信息

解法一:双指针

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # 定义左右指针
        left, right = 0, len(s) - 1
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

解法二:栈结构

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        原地修改,不用返回s,直接对s操作反转了!
        """
        stack = []        # 定义空栈stack[]
        for char in s:    # 从头遍历s中所有字符
            stack.append(char)  # 入栈用.append(xxx)实现
        # 实现了将s所有字符入栈,利用栈的结构特点 
        # 先入栈的后出栈,就实现了反转
        # for i in len(s):  len(s)是个数字,长度!for要for一个范围
        for i in range(len(s)):
            s[i] = stack.pop()  # i指定s[i]位置进行修改,.pop是出栈操作      
        

解法三:range函数

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(n // 2):
            s[i], s[n - i - 1] = s[n - i - 1], s[i]

解法四:reversed函数

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = reversed(s)

对这段代码中涉及的reversed函数和切片操作的详细解释:

一、reversed函数

二、切片操作

为什么代码这样写

解法五:切片

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]

让我们来通俗地理解这段代码涉及的知识点。

一、字符串切片

想象字符串就像一串漂亮的珠子,每个珠子代表一个字符。字符串切片就像是从这串珠子中选取一部分珠子的工具。

二、赋值给s[:]

现在想象s是一个装着珠子的盒子。s[:]表示整个盒子里的所有珠子。把s[::-1]赋值给s[:],就像是把用特殊切片方法得到的反转后的那串珠子,全部替换掉原来盒子里的珠子。这样就实现了在不创建新盒子(不占用额外空间)的情况下,把原来盒子里的珠子顺序反转了。

所以这段代码的作用就是通过巧妙地利用字符串切片和赋值操作,原地反转了给定的字符串(实际上是字符列表)。

解法六:列表推导

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = [s[i] for i in range(len(s) - 1, -1, -1)]

以下是对这种解法思路的详细解释,包括涉及的语法知识:

一、列表推导式的原理

二、索引的反向遍历

三、切片赋值实现反转

这种解法的设计思路是利用列表推导式快速生成反转后的字符列表,然后通过切片赋值将其覆盖到原始字符串上,从而实现不使用额外空间的字符串反转。这种方法展示了 Python 语言中列表推导式和切片操作的灵活性和强大功能。

解法七:reverse()函数

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s_list = list(s)
        s_list.reverse()
        s[:] = s_list

综上所述,这些解法展示了 Python 中多种不同的编程技巧和数据结构的用法,通过巧妙地利用这些知识,可以高效地解决字符串反转问题。

补充:
元组:在Python中,元组(Tuple)是一种不可变的有序序列,它与列表类似,但有一些重要的区别。以下是关于元组的详细介绍:

元组的定义

元组的特点

在同时赋值中的作用

为什么使用元组概念

元组在Python中有多种应用场景,以下是一些常见的例子:

数据打包与解包

def get_name_and_age():
    return "Alice", 25

name, age = get_name_and_age()
print(name)  
print(age)  

在这个例子中,get_name_and_age函数返回了一个包含姓名和年龄的元组,然后通过多变量赋值将元组中的值分别赋给了nameage变量。

a = 5
b = 10
a, b = b, a
print(a)  
print(b)  

函数参数传递

def draw_point(point):
    x, y = point
    print(f"绘制点 ({x}, {y})")

point = (3, 4)
draw_point(point)
def print_args(*args):
    for arg in args:
        print(arg)

print_args(1, 2, 3, "hello")

数据保护与不可变性

COLORS = ('red', 'green', 'blue')
# 以下代码会引发错误,因为元组是不可变的
# COLORS[0] = 'yellow'

数据结构中的元素

student_info = {('Alice', 25): '优秀', ('Bob', 22): '良好'}
print(student_info[('Alice', 25)])  
my_set = {(1, 2), (3, 4), (1, 2)}
print(my_set)  

并行迭代

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")

数据库操作

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("SELECT name, age FROM students")
results = cursor.fetchall()
for row in results:
    print(row)  
conn.close()

这些只是元组在Python中的一些常见应用场景,实际上,元组在各种不同的编程任务和数据处理场景中都有广泛的应用,它的不可变性和简洁性使其成为Python编程中一个非常有用的数据结构。

以下是对range函数的详细介绍:

一、range函数的特点

二、range函数的使用方式

三、range函数的应用场景

总之,range函数是 Python 中非常实用的一个工具,它在循环控制、索引操作、生成序列等方面有广泛的应用,可以提高代码的效率和可读性。

时空复杂度分析

以下是对这七种解法的时间复杂度和空间复杂度分析以及对比:

一、解法一:双指针

二、解法二:栈结构

三、解法三:range 函数

四、解法四:reversed 函数和切片

五、解法五:切片

六、解法六:列表推导

七、解法七:reverse()函数

对比分析

综上所述,在解决这个问题时,如果对空间要求较高,可以优先选择双指针、range 函数、reversed 函数和切片等空间复杂度为 O ( 1 ) O(1)O(1) 的方法。如果更注重代码的简洁性和可读性,可以根据具体情况选择合适的解法。

总结

到此这篇关于python反转字符串的七种解法的文章就介绍到这了,更多相关python反转字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文