151. 反转字符串中的单词
1.1 题目大意 描述:给定一个字符串 s。 要求:反转字符串中所有单词的顺序。 说明: 单词:由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的单词分隔开。 输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。 s 包含英文大小写字母、数字和空格 ’ ’ s中至少存在一个单词。
解题思路:
1.直观思路:删除前后导空格;将整个字符串反转;再按单词间的空格将各个单词反转。
return ' '.join([i[::-1] for i in s.strip()[::-1].split()])
2.分割+倒序:删除前后空格;分割单词;倒序遍历到列表;组合为字符串。
return(' '.join([i for i in s.strip().split()[::-1]]))
3.双指针:删除前后空格;初始化左右指针,倒序遍历;当遍历到正常的单词字母时,左指针左移,直到遇到空格,就添加当前边界的字符串到结果列表;当遇到空格,左指针左移跳过,并重置右指针到左指针位置。这样就能把所有单词全部加入结果列表。
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip()
res = []
left, right = len(s)-1,len(s)-1
while left >= 0:
while left >= 0 and s[left] != ' ':
left -= 1
res.append(s[left+1: right+1])
while left >= 0 and s[left] == ' ':
left -= 1
right = left
return(' '.join(res))
43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 = “2”, num2 = “3”
输出: “6”
解题思路:参照小学乘法的竖式解法,两个nums的数字逐个相乘。
官方题解
不会写,直接背代码
def multiply(num1, num2):
# 如果任一数字为"0",根据乘法原理,结果也应为"0"
if num1 == "0" or num2 == "0":
return "0"
# 获取两个数字字符串的长度
m, n = len(num1), len(num2)
# 初始化一个足够长的结果数组,长度为两个输入数字长度之和
# 这样做是因为两个n位数的乘积最多为2n位
res = [0] * (m + n)
# 从右向左遍历num1中的每一位(即从低位到高位)
for i in range(m - 1, -1, -1):
# 同样从右向左遍历num2中的每一位
for j in range(n - 1, -1, -1):
# 计算当前位的乘积
mul = (ord(num1[i]) - ord('0')) * (ord(num2[j]) - ord('0'))
# 确定当前乘积在结果数组中的位置
p1, p2 = i + j, i + j + 1
# 将当前乘积与结果数组中已有的数值相加(包括之前的进位)
sum_ = mul + res[p2]
# 处理进位,将进位加到高一位
res[p1] += sum_ // 10
# 更新当前位的值
res[p2] = sum_ % 10
# 将结果数组转换为字符串,使用列表推导式和join函数
# 这里直接将数组中的每个数字转换成字符串,并拼接起来
result = ''.join(str(x) for x in res)
# 去除结果字符串前面的所有"0"(如果有的话)
# 注意:lstrip('0')会保留字符串中的最后一个"0"(如果整个字符串是"0")
return result.lstrip('0')
# 示例
print(multiply("2", "3")) # 应输出: "6"
print(multiply("123", "456")) # 应输出: "56088"
14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs =
[“flower”,“flow”,“flight”] 输出:“fl”
解题思路:
要求最长公共前缀,那我们就假设第一个字符串是最长公共前缀。
然后针对每两个相邻字符串比较,找到他们的公共前缀;逐个遍历,这样对于每对相邻子串都得到了他们的公共前缀,如果新的比上一个短,那就要取最短的,如果空了,那就返回空。
每对相邻子串 这里的优化措施是将其与上一步得到的公共前缀一起遍历,这样能够减少遍历次数。
class Solution:
def longestCommonPrefix(self, strs):
if not strs:
return ""
# 初始化最长公共前缀为第一个字符串
prefix = strs[0]
# 从第二个字符串开始遍历
for s in strs[1:]:
temp = ""
# 比较当前字符串s和最长公共前缀prefix的每个字符
for i in range(min(len(s), len(prefix))):
if s[i] == prefix[i]:
temp += s[i]
else:
break
prefix = temp # 更新最长公共前缀
# 如果公共前缀为空,直接返回
if not prefix:
return ""
return prefix