力扣每日练习3.12

本文介绍了如何反转字符串中单词的顺序,通过多种方法实现,如直观思路、分割倒序、双指针等。还涉及到了字符串乘法的解法以及寻找字符串数组中最长公共前缀的算法。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值