LeetCode 344.反转字符串:
看到题目后的思路:
- 利用待交换字符的位置序号之间的关系
要求是原地反转字符串,遍历字符串的前半部分,每个字符都与后半部分对应位置交换位置。
i 与 len - 1 - i
class Solution(object):
def reverseString(self, s):
len_s = len(s)
for i in range(len_s//2):
s[i], s[len_s - 1 - i] = s[len_s - 1 - i], s[i]
- 双指针
left指针和right指针分别指向字符串的头部和尾部,不断交换指针所指向的值。
class Solution(object):
def reverseString(self, s):
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
LeetCode 541.反转字符串Ⅱ:
看到题目后的想法
- 转换为列表后进行处理
注意到输入为字符串,因此处理时要先将其转换为列表。且遍历列表的步长为 2 * k
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
def reverse_partS(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 i in range(0, len(res), 2 * k):
res[i:i + k] = reverse_partS(res[i:i + k]) # 当i + k > res时,返回的是列表最后一个元素
return ''.join(res)
- 每次反转时都重新赋值整个字符串
(还可以再研究一下)
class Solution(object):
def reverseStr(self, s, k):
p, len_s = 0, len(s)
while p < len_s:
p2 = p + k
s = s[:p] + s[p:p2][::-1] + s[p2:]
p = p + 2*k
return s
实现过程中遇到的困难:
惯性思维步长为1了,在这道题目中其实步长为2 * k更合适
卡码网 54.替换数字:
看到题目后的想法:
先扩充字符串数组,然后使用双指针从后向前填充该数组,newIndex指向新数组的结尾,oldIndex指向旧数组的结尾。
在扩充后的数组中从后向前填充的优点:① 不需要使用额外的辅助空间 ② 降低算法复杂度为O(n);如果从前向后填充的话,每次替换number时,都需要将后面的元素整体后移,时间复杂度为O(n^2)
但是python中的String不能扩充,因此还是需要使用额外的辅助空间。
class Solution:
def replaceNumber(self, s):
res = list(s)
number = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for i in range(len(s)):
# 判断是否为数字
#if res[i].isdigit():
#if ord("0") <= ord(res[i]) <= ord("9"):
if res[i] in number:
res[i] = "number"
return ''.join(res)
solution = Solution()
s = input()
result = solution.replaceNumber(s)
print(result)
实现过程中遇到的困难:
需要记住有几种判断字符是否为数字的方法
学习收获:
① python中的String字符串不能对其中的单个进行替换,如果需要替换的话,要么将其转换为列表替换后再转换为字符串;要么将不变的部分和替换的部分拼接为新的字符串后全部替换。
② 双指针在字符串中的使用。
③ 几种判断字符是否为数字的方法:ord、列表、isdigit()