反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

  • 示例 1:
    输入:[“h”,”e”,”l”,”l”,”o”]
    输出:[“o”,”l”,”l”,”e”,”h”]
  • 示例 2:
    输入:[“H”,”a”,”n”,”n”,”a”,”h”]
    输出:[“h”,”a”,”n”,”n”,”a”,”H”]
1
2
3
4
5
6
7
8
9
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
j=len(s)-1
for i in range(len(s)//2):
s[i],s[j] = s[j],s[i]
j -= 1

这道题的思路是用双指针的方式,分别指向头尾,然后交换位置,循环判断条件就到中间位置(比长度的一半小)。

反转字符串II

leetcode链接

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

  • 示例:
    输入: s = “abcdefg”, k = 2
    输出: “bacdfeg”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def c_r(s_):
left,right = 0,len(s_)-1
while left < right:
s_[left],s_[right]=s_[right],s_[left]
left += 1
right -= 1
return s_

i=0
s_list=list(s)
while i < len(s):
s_list[i:i+k] = c_r(s_list[i:i+k])
i += 2 * k
return "".join(s_list)
1
2
3
4
5
6
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
for i in range(0, len(s), 2*k):
s[i:i+k] = s[i:i+k][::-1]
return ''.join(s)

这道题的主要特点是切片的方式是以2k为步长,每次取k个字符进行反转。
并且python的切片操作是可以超出索引范围的,会自动截断为有效范围。(Python 切片的容错特性:无需判断剩余字符长度,i:i+k 自动截断为有效范围,让 “反转前 k 个 / 反转全部剩余” 的要求自然满足),i相当于一个指针,每次移动2k个位置,只要能移动在下一次循环就进行切片。

替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

  • 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
    对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”
    输入:一个字符串 s,s 仅包含小写字母和数字字符。
    输出:打印一个新的字符串,其中每个数字字符都被替换为了number
    样例输入:a1b2c3
    样例输出:anumberbnumbercnumber
    数据范围:1 <= s.length < 10000。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
n = input()
count_num = sum(1 for i in n if i.isdigit())
count = count_num * 5 + len(n) #记得count_num是数字字符的个数,每个数字字符替换为number后会增加5个字符,所以是*5
n_list = [''] * count
o_p = len(n)- 1
n_p = count - 1
while o_p >= 0:
if n[o_p].isdigit():
n_list[n_p-5:n_p+1] = "number" #注意切片是位置到位置,不能直接[n_p-5:6]这种操作
n_p -= 6
else :
n_list[n_p]=n[o_p]
n_p -= 1
o_p -= 1
print("".join(n_list))

这道题还是用双指针的方式,一个指向原字符串的尾,一个指向新字符串的尾,根据是否为数字字符来判断是否需要替换。
如果是c语言从后向前可以避免每次替换后需要移动后面的字符的问题。python因为字符串是不可变的,所以需要先将字符串转换为列表,修改后再转换为字符串。
然后就是要两个指针一一对应,一个指向原字符串的当前字符,一个指向新字符串的当前位置。