代码随想录算法训练营第八天|344. 反转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词
344. 反转字符串
【注意】
1.双指针法,原地进行操作。
2.字符串也是一种数组,所以元素在内存中是连续分布。
【代码】
return s.reverse()
1 class Solution(object): 2 def reverseString(self, s): 3 """ 4 :type s: List[str] 5 :rtype: None Do not return anything, modify s in-place instead. 6 """ 7 n = len(s) 8 left = 0 9 right = n - 1 10 # while left < n//2: #奇数时,中间数不需要操作 11 # temp = s[left] 12 # s[left] = s[right] 13 # s[right] = temp 14 # left += 1 15 # right -= 1 16 17 # return s 18 # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低 19 # 推荐该写法,更加通俗易懂 20 while left < right: 21 s[left], s[right] = s[right], s[left] 22 left += 1 23 right -= 1 24 25 return s
541. 反转字符串 II
【代码】
s[p: p2][::-1] #反转
1 class Solution(object): 2 def reverseStr(self, s, k): 3 """ 4 :type s: str 5 :type k: int 6 :rtype: str 7 """ 8 1. 使用range(start, end, step)来确定需要调换的初始位置 9 def reverse_substring(text): 10 left = 0 11 right = len(text) - 1 12 13 while left <right: 14 text[left], text[right] = text[right], text[left] 15 left += 1 16 right -= 1 17 return text 18 19 res = list(s) 20 21 for cur in range(0, len(s), 2*k): 22 res[cur: cur + k] = reverse_substring(res[cur:cur + k]) 23 return ''.join(res) 24 25 #方法2. 26 # Two pointers. Another is inside the loop. 27 p = 0 28 while p < len(s): 29 p2 = p + k 30 # Written in this could be more pythonic. 31 s = s[:p] + s[p: p2][::-1] + s[p2:] #[.....左闭右开) 32 p = p + 2 * k 33 34 return s
剑指 Offer 05. 替换空格
【注意】
1.很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
2.
1 list.append(obj) #在列表末尾添加新的对象,相当于其它语言里的push 2 list.count(obj) #统计某个元素在列表中出现的次数 3 list.extend(seq) #在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
1 # 字符串 2 y = '1345' 3 list(y) # ['1', '3', '4', '5'] 将列表转换成列表 4 5 # 元组 6 z = ('a', 'b', 'c') 7 list(z) # ['a', 'b', 'c'] 将元组转换成列表 8 9 # 字典 10 d = {'Name': 'Tom', 'Age': 7, 'Class': 'First'} 11 list(d) # ['Name', 'Age', 'Class'] 字典 key 转成列表 12 list(d.values()) # ['Tom', 7, 'First'] 字典 value 转成列表 13 # 字典键值对(一个元组)转成列表 14 list(d.items()) # [('Name', 'Tom'), ('Age', 7), ('Class', 'First')]
1 s = "We are happy." 2 s = s.replace(' ', '%20') 3 print(s) 4 5 s = "I love you" 6 res = " ".join(s.split(" ")[::-1])[::-1] 7 8 I evol uoy 9 10 " ".join(s.split()) 拼接后的返回值为str类型!
【代码】
1 class Solution(object): 2 def replaceSpace(self, s): 3 """ 4 :type s: str 5 :rtype: str 6 """ 7 #方式1 8 counter = s.count(' ') 9 10 res = list(s) 11 # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘ 12 res.extend([' '] * counter * 2) 13 # 原始字符串的末尾,拓展后的末尾 14 left, right = len(s) - 1, len(res) - 1 15 16 while left >= 0: 17 if res[left] != ' ': 18 res[right] = res[left] 19 right -= 1 20 else: 21 # [right - 2, right), 左闭右开 22 res[right-2: right+1] = '%20' 23 right -= 3 24 left -= 1 25 26 return ''.join(res) 27 28 #方式2 29 return "%20".join(s.split(' ')) 30 31 #方式3 32 return s.replace(' ', '%20')
151. 反转字符串中的单词
【注意】
1.空间复杂度为O(1).
【代码】
1 class Solution(object): 2 #方式1 3 #1.去除多余的空格 4 def trim_spaces(self,s): 5 n = len(s) 6 left = 0 7 right = n - 1 8 9 while left <= right and s[left] == ' ': 10 #去除开头的空格 11 left += 1 12 while left <= right and s[right] == ' ': 13 right -= 1 14 15 tmp = [] 16 while left <= right: 17 #去除单词中间多余的空格,只留一个空格 18 if s[left] != ' ': 19 tmp.append(s[left]) 20 elif tmp[-1] != ' ': 21 #当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的 22 tmp.append(s[left]) #append追加的形式还是字符 23 left += 1 24 return tmp 25 26 #反转字符数组 27 def reverse_string(self, nums, left, right): 28 while left < right: 29 nums[left], nums[right] = nums[right], nums[left] 30 left += 1 31 right -= 1 32 33 return None 34 35 #3.翻转每个单词 36 def reverse_each_word(self, nums): 37 start = 0 38 end = 0 39 n = len(nums) 40 41 while start < n: 42 while end < n and nums[end] != ' ': 43 #找到每一个单词 44 end += 1 45 #对每一个单词再翻转成原来的顺序 46 self.reverse_string(nums, start, end-1) #end最后的位置在空格处,所以再减一 47 start = end + 1 48 end += 1 #下一个单词的首字母 49 return None 50 #4.翻转字符串里的单词 51 def reverseWords(self, s): 52 """ 53 :type s: str 54 :rtype: str 55 """ 56 l = self.trim_spaces(s) 57 self.reverse_string(l, 0, len(l)-1) 58 self.reverse_each_word(l) 59 60 return ''.join(l) 61 62 #方式2 63 def reverseWords(self, s): 64 s_list = [i for i in s.split(' ') if len(i) > 0] 65 return " ".join(s_list[::-1]) 66 #return " ".join(s.split(" ")[::-1])
剑指 Offer 58 - II. 左旋转字符串
【注意】
局部反转+整体反转
具体步骤为:
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
【代码】
1 class Solution(object): 2 def reverseLeftWords(self, s, n): 3 """ 4 :type s: str 5 :type n: int 6 :rtype: str 7 """ 8 #方法1 --切片 9 return s[n:] + s[0:n] 10 11 #方法2 --reversed() 12 s = list(s) 13 s[0:n] = list(reversed(s[0:n])) 14 s[n:] = list(reversed(s[n:])) 15 s.reverse() 16 17 return "".join(s) 18 19 #方法3 20 def reverse_sub(lst, left, right): 21 while left <right: 22 lst[left], lst[right] = lst[right], lst[left] 23 left += 1 24 right -= 1 25 26 res = list(s) 27 end = len(res) - 1 28 reverse_sub(res, 0, n-1) 29 reverse_sub(res, n, end) 30 reverse_sub(res, 0, end) 31 32 return ''.join(res)
分类:
代码随想录刷题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?