【字符串-01】
目录
- 剑指 Offer 58 - I. 翻转单词顺序/151. 翻转字符串里的单词
- 剑指 Offer 58 - II. 左旋转字符串
- 剑指 Offer 38. 字符串的排列(字符串和回溯)
- 剑指 Offer 67. 把字符串转换成整数/8. 字符串转换整数 (atoi)
字符串有很多内置操作:比如
s.strip() # 删除首尾空格,
s.split() # 分割字符串;
s.reverse() # 翻转单词列表,
' '.join(strs) # 拼接为字符串。
也可以转换为数组进行操作,便可使用append等。
一、剑指 Offer 58 - I. 翻转单词顺序/151. 翻转字符串里的单词
1.1 问题
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
1.2 代码(使用API)
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip() # 删除首尾空格
strs = s.split() # 分割字符串
strs.reverse() # 翻转单词列表
return ' '.join(strs) # 拼接为字符串并返回
1.3 代码(非API)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Solution: def reverseWords(self, s: str) -> str: left, right = 0, len(s) - 1 # 去掉字符串开头的空白字符 while left <= right and s[left] == ' ': left += 1
# 去掉字符串末尾的空白字符 while left <= right and s[right] == ' ': right -= 1
d, word = collections.deque(), [] # 将单词 push 到队列的头部 while left <= right: if s[left] == ' ' and word: d.appendleft(''.join(word)) word = [] ;#注意清空word elif s[left] != ' ': word.append(s[left]) left += 1 d.appendleft(''.join(word)) # 最后一个加进去 return ' '.join(d) |
二、剑指 Offer 58 - II. 左旋转字符串
2.1 问题
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
2.2 代码(切片的使用)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[:n]
2.3 代码(数组方式)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = []
for i in range(n, len(s)):
res.append(s[i])
for i in range(n):
res.append(s[i])
return ''.join(res)
或(余数技巧)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = []
for i in range(n, n + len(s)):
res.append(s[i % len(s)])
return ''.join(res)
2.4 代码,不使用join函数
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = ""
for i in range(n, len(s)):
res += s[i]
for i in range(n):
res += s[i]
return res
或:
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
res = ""
for i in range(n ,n+len(s)):
res += s[i%len(s)] #注意除以这个长度
return res
三、剑指 Offer 38. 字符串的排列(字符串和回溯)
3.1 问题
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
3.2 代码一
解释见参考文献的连接:
class Solution:
def permutation(self, s: str) -> List[str]:
c, res = list(s), []
def dfs(x):
if x == len(c) - 1:
res.append(''.join(c)) # 添加排列方案
return
dic = set()
for i in range(x, len(c)):
if c[i] in dic: continue # 重复,因此剪枝
dic.add(c[i])
c[i], c[x] = c[x], c[i] # 交换,将 c[i] 固定在第 x 位
dfs(x + 1) # 开启固定第 x + 1 位字符
c[i], c[x] = c[x], c[i] # 恢复交换
dfs(0)
return res
3.3 代码二
class Solution:
def permutation(self, s: str) -> List[str]:
self.res = []
n = len(s)
def backtrack(s, path):
if not s:
self.res.append(path)
seen = set()
for i in range(len(s)):
if s[i] in seen: continue #去掉重复的排序情况
seen.add(s[i])
backtrack(s[:i]+s[i+1:], path + s[i])#每次固定一个
backtrack(s, "")
return self.res
四、剑指 Offer 67. 把字符串转换成整数/8. 字符串转换整数 (atoi)
4.1 问题
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
输入: "42"
输出: 42
示例 2:
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
4.2 代码
class Solution:
def strToInt(self, str: str) -> int:
int_max, int_min, bndry = 2147483647, -2147483648, 2 ** 31 // 10
str = str.strip()
if not str: return 0
res,i,signe = 0,1,1
if str[0] == '-' :signe = -1
elif str[0] != '+' :i =0 #这里是elif,若无符号位,则需从 i = 0 开始数字拼接
for c in str[i:]:
if not '0' <= c <= '9':break
if res > bndry or res == bndry and c > '7' :
return int_max if signe ==1 else int_min
res = res * 10 + ord(c) - ord('0') # 数字拼接
return res *signe