wuyijia

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

代码随想录算法训练营第八天|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.很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

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. 左旋转字符串

【注意】

局部反转+整体反转

具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

【代码】

复制代码
 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)
复制代码

 

posted on   小吴要努力  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示