1. 344_反转字符串
题目来源:力扣
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例1, 输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
示例2, 输入:s = ["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
使用库函数,代码如下,
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
s.reverse()
return s
2. 541_反转字符串II
题目来源:力扣
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例1, 输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例2, 输入:s = "abcd", k = 2 输出:"bacd"
结题思路如下,
图1. 翻转字符串示例
代码,
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
r = ""
# 标记当前的索引为奇数k倍,还是偶数k被
tag = 0
i_left = tag * k
i_right = (tag + 1) * k
while i_left < len(s):
# 注意,这里的[ )为左开右闭,因此当i_right == len-1时,不能使用else
if i_right <= len(s)-1:
tmp_r = list(s[i_left: i_right])
else:
tmp_r = list(s[i_left:])
# 当tag是o偶数k倍,比如0时,翻转,插入结果
if tag % 2 == 0:
tmp_r.reverse()
r += "".join(tmp_r)
tag += 1
i_left = tag * k
i_right = (tag + 1) * k
return r
if __name__ == '__main__':
sol = Solution()
s = "abcdefg"
k = 3
r = sol.reverseStr(s, k)
print(r)
3. 151_颠倒字符串中的单词
题目来源:力扣
给你一个字符串 s ,颠倒字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
代码思路:
(1)从非空的字符串开始;
(2)将连续的字符存入列表;
(3)遇到连续空格不做。
最后将列表反转,使用" ".joint(lst.reverse())。代码如下,
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
r = []
i = 0
# 先吞空格
while i <= len(s) - 1 and s[i] == " ":
i += 1
while i <= len(s)-1:
st = ""
while i <= len(s)-1 and s[i] != " ":
st += s[i]
i += 1
r.append(st)
while i <= len(s)-1 and s[i] == " ":
i += 1
r.reverse()
r = " ".join(r)
return r
if __name__ == '__main__':
sol = Solution()
s = "asdasd df f"
r = sol.reverseWords(s)
print(r)