leetcode分类刷题:字符串及单词翻转

1、本文此次总结的题型“leetcode分类刷题:字符串及单词翻转”较为简单,是双指针法在字符串及单词翻转类题型中的应用
2、如果单词翻转类题型加了O(1)空间复杂度的要求,算法思路会变得稍微复杂一点

344. 反转字符串

该题为字符串翻转的基础题型,为后续题目提供了算法模板

from typing import List
'''
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:输入: s = ["h","e","l","l","o"]输出: ["o","l","l","e","h"]
题眼:字符串数组原地反转
思路:双指针分别指向数组两端进行两两交换。
'''class Solution:def reverseString(self, s: List[str]) -> None:left, right = 0, len(s) - 1while left < right:  # 不同的两个字符串交换,所以不用取等号s[left], s[right] = s[right], s[left]left += 1right -= 1if __name__ == "__main__":obj = Solution()while True:try:s = [n[1: -1] for n in input().strip().split('=')[1].strip()[1: -1].split(',')]print(s)obj.reverseString(s)print(s)except EOFError:break

541. 反转字符串 II

“344. 反转字符串”的扩展; 每隔 2k 个字符的前 k 个字符进行反转

from typing import List
'''
541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:输入: s = "abcdefg", k = 2输出: "bacdfeg"
题眼:字符串反转
思路:“344. 反转字符串”的扩展; 每隔 2k 个字符的前 k 个字符进行反转
'''class Solution:def reverseStr(self, s: str, k: int) -> str:# 注意不是按照字符数组的形式给定了,需要一开始就转换为字符数组sList = list(s)for i in range(0, len(sList), 2 * k):# “344. 反转字符串”的模板代码left = iright = left + k - 1  # 注意这里需要-1if right >= len(sList):  # 剩余字符少于 k 个,则将剩余字符全部反转right = len(sList) - 1while left < right:sList[left], sList[right] = sList[right], sList[left]left += 1right -= 1return ''.join(sList)if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = in_line[1].strip().split(',')[0][1: -1]k = int(in_line[2].strip())print(s, k)print(obj.reverseStr(s, k))except EOFError:break

345. 反转字符串中的元音字母

“344. 反转字符串”的扩展; 额外增加了对元音字母的检索

from typing import List
'''
345. 反转字符串中的元音字母
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现。
示例 1:输入:s = "hello"输出:"holle"
题眼:字符串反转
思路:
'''class Solution:def reverseVowels(self, s: str) -> str:# 字符串转换为字符串数组sList = list(s)hashTable = {'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U'}left, right = 0, len(sList) - 1while left < right:while left < right and sList[left] not in hashTable:  # 注意添加 left < rightleft += 1while left < right and sList[right] not in hashTable:  # 注意添加 left < rightright -= 1if left < right:  # 注意添加 left < rightsList[left], sList[right] = sList[right], sList[left]left += 1right -= 1return ''.join(sList)if __name__ == "__main__":obj = Solution()while True:try:s = input().strip().split('=')[1].strip()[1: -1]print(obj.reverseVowels(s))except EOFError:break

151. 反转字符串中的单词

1、字符串中的单词翻转题目里最难的一道题,搞清楚这道题目O(1)空间复杂度的算法思路,后续几道题都会比较简单
2、第一步,按照“27.移除元素”移除所有空格稍加改动,并给单词之间添加一个空格;第二步,将所有元素翻转;第三步,将每个单词翻转
3、注意 添加单词到新的字符串数组删除字符串中的多余空格将每个单词翻转 都可以套用同一个模板,即 按照“27.移除元素”移除所有空格稍加改动 的模板

from typing import List
'''
151. 反转字符串中的单词
给一个字符串s,请反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 2:输入:s = "  hello world  "输出:"world hello"解释:反转后的字符串中不能存在前导空格和尾随空格。
题眼:单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串
思路1、第一步,将单词取出来,并存放到一个待定List[str]中 —— 用双指针之左右指针的思路;第二步,将List[str]反转
思路2、O(1)空间复杂度;第一步,按照“27.移除元素”移除所有空格稍加改动,并给单词之间添加一个空格;第二步,将所有元素翻转;第三步,将每个单词翻转
'''class Solution:def reverseWords(self, s: str) -> str:# # 思路1、两步操作# # 第一步,将输入转换为字符串数组# # 新的思路写法:双指针之快慢指针,快指针遍历字符串:检测单词左边界+标记单词右边界,慢指针标记单词左边界# sList = []# slow, fast = 0, 0# while fast < len(s):#     if s[fast] != ' ':  # 检测到单词开头,将整个单词检索下来#         slow = fast  # 慢指针标记单词左边界#         while fast < len(s) and s[fast] != ' ':  # 快指针标记单词右边界+1的位置#             fast += 1#         sList.append(s[slow: fast])  # 此时,一定可以添加到一个单词#     else:#         fast += 1# # 之前的思路写法# # wordLeft, wordRight = 0, 0# # while wordRight < len(s):# #     while wordRight < len(s) and s[wordRight] == ' ':  # wordRight指示到遍历到的单词的首字母位置# #         wordRight += 1# #     wordLeft = wordRight  # wordLeft&wordRight同时指示到遍历到的单词的首字母位置# #     while wordRight < len(s) and s[wordRight] != ' ':  # wordRight指示到单词的尾字母的下一位置# #         wordRight += 1# #     if wordLeft < wordRight:  # 确保单词是有效的,wordLeft==wordRight是个空字符# #         sList.append(s[wordLeft: wordRight])# # 第二步,将字符串数组反转# left, right = 0, len(sList) - 1# while left < right:#     sList[left], sList[right] = sList[right], sList[left]#     left += 1#     right -= 1# return ' '.join(sList)# # 思路2、O(1)空间复杂度:C++可以直接实现;Python实际上还是O(N)的,不过可以模拟一下# 第一步,按照“27.移除元素”移除所有空格稍加改动,并给单词之间添加一个空格# 最终slow标记到了新字符串的末尾+1的位置,表示新字符串的长度sList = list(s)slow, fast = 0, 0while fast < len(sList):if sList[fast] != ' ':  # 检测到单词开头if slow != 0:  # 此时意味着开始检测到第二个及后续的单词了,对整个单词前移前先添加一个空格sList[slow] = ' 'slow += 1while fast < len(sList) and sList[fast] != ' ':  # 将整个单词进行前移sList[slow] = sList[fast]slow += 1fast += 1else:fast += 1newStrLen = slow# 第二步,将所有元素翻转# 定义翻转函数def reverseFunc(s: List[str], left: int, right: int):while left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1reverseFunc(sList, 0, newStrLen - 1)# 第三步,将每个单词翻转:发现检测单词的思路 可以继续沿用上面 添加单词、删除空格 的模板slow, fast = 0, 0while fast < newStrLen:if sList[fast] != ' ':  # 检测到单词开头,将整个单词检索下来slow = fastwhile fast < newStrLen and sList[fast] != ' ':  # 快指针标记单词右边界+1的位置fast += 1reverseFunc(sList, slow, fast - 1)  # 此时,一定可以检测到一个单词,调用翻转函数else:fast += 1return ''.join(sList[0: newStrLen])if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = in_line[1].strip()[1: -1]print(s)print(obj.reverseWords(s))except EOFError:break

186. 反转字符串中的单词II

“151. 反转字符串中的单词”的简化版:第一步,将所有元素翻转;第二步,将每个单词翻转

from typing import List
'''
186. 反转字符串中的单词II
给你一个字符数组 s ,反转其中 单词 的顺序。
单词 的定义为:单词是一个由非空格字符组成的序列。s 中的单词将会由单个空格分隔。
必须设计并实现 原地 解法来解决此问题,即不分配额外的空间。
注意:输入字符串中不会包含前置或尾随的空格,单词与单词之间永远是以单个空格隔开的。
示例 1:输入:s = [“t”,“h”,“e”," “,“s”,“k”,“y”,” “,“i”,“s”,” “,“b”,“l”,“u”,“e”]输出:[“b”,“l”,“u”,“e”,” “,“i”,“s”,” “,“s”,“k”,“y”,” ",“t”,“h”,“e”]
示例 2:输入:s = [“a”]输出:[“a”]
题眼:O(1)空间复杂度
思路、第一步,将所有元素翻转;第二步,将每个单词翻转
'''class Solution:def reverseWords(self, s: List[str]):# 定义翻转函数def reverseFunc(s: List[str], left: int, right: int):while left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1# 第一步,将所有元素翻转reverseFunc(s, 0, len(s) - 1)# 第二步,将每个单词翻转slow, fast = 0, 0while fast < len(s):if s[fast] != ' ':  # 检测到单词开头slow = fast  # 标记单词左边界while fast < len(s) and s[fast] != ' ':  # 标记单词右边界+1的位置fast += 1reverseFunc(s, slow, fast - 1)  # 一定可以检测到完整的一个单词,完成翻转操作else:fast += 1if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = [c[1: -1] for c in in_line[1].strip()[1: -1].split(',')]print(s)obj.reverseWords(s)print(s)except EOFError:break

557. 反转字符串中的单词 III

“186. 反转字符串中的单词II”的简化版:直接将每个单词翻转

from typing import List
'''
557. 反转字符串中的单词 III
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
提示:s 不包含任何开头或结尾空格。s 里 至少 有一个词。s 中的所有单词都用一个空格隔开。
示例 2:输入:s = "Let's take LeetCode contest"输出:"s'teL ekat edoCteeL tsetnoc"
题眼:
思路、直接将每个单词翻转
'''class Solution:def reverseWords(self, s: str) -> str:# 字符串转换为字符串数组sList = list(s)# 定义翻转函数def reverseFunc(s: List[str], left: int, right: int):while left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1# 将每个单词翻转slow, fast = 0, 0while fast < len(sList):if sList[fast] != ' ':  # 检测到单词开头slow = fast  # 标记单词左边界while fast < len(sList) and sList[fast] != ' ':  # 标记单词右边界+1的位置fast += 1reverseFunc(sList, slow, fast - 1)  # 一定可以检测到完整的一个单词,完成翻转操作else:fast += 1return ''.join(sList)if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = in_line[1].strip()[1: -1]print(obj.reverseWords(s))except EOFError:break

剑指 Offer 58 - II. 左旋转字符串

O(1)空间复杂度的解法(Python只能模拟一下):将字符串一分为二地看待,看成是两个单词(一个长度为k,一个长度为len(s)-k)
最终的效果就相当于是把两个单词翻转;类似于“186. 反转字符串中的单词II”的思路

from typing import List
'''
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,
该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"
题眼:旋转
思路:O(1)空间复杂度的解法(Python只能模拟一下):将字符串一分为二地看待,看成是两个单词(一个长度为k,一个长度为len(s)-k),
最终的效果就相当于是把两个单词翻转;类似于“186. 反转字符串中的单词II”的思路
'''class Solution:def reverseLeftWords(self, s: str, n: int) -> str:# 字符串转换为字符串数组sList = list(s)# 定义翻转函数def reverseFunc(s: List[str], left: int, right: int):while left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1# 第一步,将所有元素翻转reverseFunc(sList, 0, len(sList) - 1)# 第二步,将两个单词分别翻转,第一个单词左右边界[0, len(s)-n-1],第二个单词左右边界[len(s)-n, len(s)-1]reverseFunc(sList, 0, len(s) - n - 1)reverseFunc(sList, len(s) - n, len(s) - 1)return ''.join(sList)if __name__ == "__main__":obj = Solution()while True:try:in_line = input().strip().split('=')s = in_line[1].strip().split(',')[0].strip()[1: -1]k = int(in_line[2])print(obj.reverseLeftWords(s, k))except EOFError:break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ConsoleApplication17_2项目免杀(Fiber+VEH Hook Load)

加载方式FiberVEH Hook Load Fiber是纤程免杀&#xff0c;VEH是异常报错&#xff0c;hook使用detours来hook VirtualAlloc和sleep&#xff0c;通过异常报错调用实现主动hook 纤程Fiber的概念&#xff1a;纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程&#…

InVEST模型+SolVES模型教程

详情点击公众号链接&#xff1a;基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析 前言 生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xf…

基于Ubuntu坏境下的Suricata坏境搭建

目录 Suricata环境安装 第一步、在 Ubuntu 端点安装 Suricata 1、加入Suricata源 2、更新安装包 3、下载SuricataSuricata 第二步、下载并提取新兴威胁 Suricata 规则集 1、在tmp文件夹下载 Suricata 规则集 如果发现未安装curl&#xff0c;使用apt安装即可&#xff1a…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

简单shell脚本的编写

文章目录 简单使用shell脚本参数判断整数的比较运算符字符串的比较运算shell脚本流程控制shell脚本循环for循环批量添加用户批量ping IP地址检测同一局域网&#xff0c;多台主机存活情况检测同一局域网&#xff0c;多台主机存活情况多线程检测主机存活情况 while循环case选择语…

Python中处理Excel文件的常见问题与技巧

在数据分析和办公自动化领域&#xff0c;Excel是一种广泛使用的工具。本文将介绍如何利用Python来处理Excel文件时可能遇到的常见问题&#xff0c;并分享一些实用技巧。 1. 安装必要库 - 使用pip或conda安装openpyxl、pandas等第三方库&#xff1b; – 确保所选版本兼容性以及…

Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

一、Sentinel整合openfeign 1、复制一下order-openfeign项目&#xff08;创建order-openfeign-sentinel&#xff09; 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…

单片机学习-什么是Flash?什么是RAM?什么是ROM?

什么是Flash&#xff1f; Flash 存储器&#xff08;FLASH EEPROM&#xff09;又称闪存&#xff0c;快闪。 它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑&#xff08;EEPROM&#xff09;的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据。它于…

说说Lambda架构

分析&回答 Lambda架构是由Storm的作者Nathan Marz提出的一个实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm&#xff0c;Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的目标是设计出一个能满足实时大数据系…

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…

【校招VIP】前端算法考点之大数据相关

考点介绍&#xff1a; 大数据的关键技术分为分析技术和处理技术&#xff0c;可用于大数据分析的关键技术主要包括A/B测试&#xff0c;关联规则挖掘&#xff0c;数据挖掘&#xff0c;集成学习&#xff0c;遗传算法&#xff0c;机器学习&#xff0c;自然语言处理&#xff0c;模式…

Oracle中LEFT JOIN后AND与WHERE的异同

1、AND 过滤之后再连接 2、WHERE 连接之后再过滤 下面以具体例子来说明&#xff1a; (1)、建表及插入测试数据 --建测试表 create table FACT_TAB ( ID INTEGER,STATUS VARCHAR2(8) ); create table DIM_STATUS ( STSTUS_CLASS VARCHAR2(8),STATUS_CODE VARCHAR2(8),S…

Spring框架知识点汇总

01.Spring框架的基本理解 关键字&#xff1a;核心思想IOC/AOP&#xff0c;作用&#xff08;解耦&#xff0c;简化&#xff09;&#xff0c;简单描述框架组成&#xff1b; Spring框架是一款轻量级的开发框架&#xff0c;核心思想是IOC&#xff08;反转控制&#xff09;和AOP&a…

沐风老师3DMAX厨房橱柜生成器KitchenCabinetGenerator教程

3DMAX厨房橱柜生成器插件使用方法 3DMAX橱柜生成器KitchenCabinetGenerator是一个在3dMax中自动创建三维橱柜模型的高效脚本。它有多种风格的台面、门和橱柜&#xff0c;可以灵活地应用于Archviz项目&#xff0c;同时为3D艺术家节省大量时间。 【适用版本】 1.3dMax2018 – 20…

程序员宝典: 免费好物API汇总

周公解梦&#xff1a;周公解梦大全&#xff0c;周公解梦查询&#xff0c;免费周公解梦。 星座查询&#xff1a;根据日期或星座名称&#xff0c;查询星座详细信息&#xff0c;包含&#xff1a;掌管宫位、主管星、颜色、珠宝、幸运数字、性格等等。 生肖查询&#xff1a;根据生…

从零构建深度学习推理框架-10 算子的执行流程

计算图的设计 Graph的结构 Operators: 记录所有的节点Input operator: 指定的输入节点Output operator: 指定的输出节点Global input data: 模型的外部全局输入&#xff08;用户指定的输入&#xff09; Operator的结构 Input data: 节点的输入数据Output data: 节点的输出数…

❤ Uniapp使用

❤ Uniapp使用 一、介绍 uni-app官网&#xff1a;https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html 二、使用 1、uniapp 实现图片预览 单图预…

深入探索前端之道:JavaScript深拷贝与浅拷贝的解析与实现

引言 前端开发中&#xff0c;数据的复制是一个常见的操作。尤其是在处理对象和数组时&#xff0c;我们需要考虑的是一个浅拷贝还是深拷贝。那么&#xff0c;什么是深拷贝和浅拷贝&#xff1f;它们在前端开发中有什么作用&#xff1f;如何实现这两种拷贝&#xff1f;这是我们在…

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的&#xff0c;因为很多的好朋友也比较关注这方面的内容&#xff0c;所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给大家做个简单讲解&#xff0c;我这里只是抛砖引玉&#xff0c…

ArmSoM-W3 DDR压力测试

1. 简介 专栏总目录 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试&#xff0c;以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 2. 环境介绍 硬件环境&#xff1a; ArmSoM-W…