Python - 代码随想录算法训练营第八天 | LeetCode344 反转字符串、LeetCode541 反转字符串 Ⅱ、卡码网54 替换数字、LeetCode151 反转字符串中的单词、卡码网55 右旋字符串
前言
开始字符串部分啦
LeetCode344 反转字符串
题目链接
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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”]
思路:
这道题比较简单,选用两个指针left和right,分别指向左右两端。
用一个额外变量c存储right的值,然后将left的值赋给right,将c 的值赋给left。实现互换。
左右两个指针一起向中间靠拢。
最中间有两种情况:长度是偶数或者奇数。不论哪种情况,用while left<right 都可以不重不漏。
代码如下:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left = 0
right = len(s) - 1
c = 0
while left < right:
#交换二者位置
c = s[right]
s[right] = s[left]
s[left] = c
left += 1
right -= 1
LeetCode541 反转字符串 Ⅱ
题目链接
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: "bacdfeg
思路:
先借用上一题的代码,实现反转功能reverse_(s) 。
将字符串转换为列表,通过for循环range( )内的数字,巧妙解决了确定位置的难题。
最后,将列表内的内容按要求输出,这里用到了join(解释在下面)
代码如下:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
def reverse_(s):
left = 0
right = len(s) - 1
c = 0
while left < right:
#交换二者位置
c = s[right]
s[right] = s[left]
s[left] = c
left += 1
right -= 1
return s
res = list(s) #将字符串转为列表
for i in range(0,len(res),2*k): #确定每个需要反转的位置
res[i: i + k] = reverse_(res[i: i + k])
return ''.join(res)
str.join(item),join函数是一个字符串操作函数
str表示字符串(字符),item表示一个成员,注意括号里必须只能有一个成员,比如
','.join('abc')
#上面代码的含义是“将字符串abc中的每个成员以字符','分隔开再拼接成一个字符串”,输出结果为:
'a,b,c'
、卡码网54 替换数字
题目链接
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
数据范围:1 <= s.length < 10000。
思路:
这道题,如果把s转为列表会比较好做。
将s转为列表,然后遍历,遇到数字就把这里换成number。
最后,转换回字符串。
代码如下:
s = input()
s = list(s)
for i in range(len(s)): fori inrange(len(s)):
if s[i] >= '0' and s[i] <= '9':
s.insert(i,'number')
del s[i+1]
s = ''.join(s)
print(s)
在idle运行是正常的,卡码网没有登陆,不太清楚
LeetCode151 反转字符串中的单词
题目链接
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个 。
思路:
首先,把字符串
代码如下:
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip() # 删除前后空白
s = list(s.split()) #list(s.split()) 以 为分隔符,将字符串转为列表
s = s[::-1] #s[::-1] 列表的反转
s = ' '.join(s)
return s
关于 ‘输出时的间隔标志’,join()
# 列表s转换为字符串,用'',join.()
# 顺序转换
s = ' '.join(s)
# 列表反转后转换
s = ' '.join(word[::-1] for word in s)
卡码网55 右旋字符串
题目链接
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
样例输入:
2
abcdefg
样例输出:
fgabcde
数据范围:1 <= k < 10000, 1 <= s.length < 10000;
思路:
负负得正的思路,有点感觉了。时间来不及,先挖坑吧
代码如下:
总结
-
待改进:有一个坑没有填,我会记得回来填的
-
收获 :查明了’',join() 以及s[::-1] 等用法,小技巧对代码编写挺有用的