【DW组队学习—LeetCode】day06

39 篇文章 1 订阅
18 篇文章 0 订阅

43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
【示例 1】输入: num1 = “2”, num2 = “3” 输出: “6”
【示例 2】输入: num1 = “123”, num2 = “456” 输出: “56088”
说明:

  • num1 和 num2 的长度小于110。
  • num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

尝试思路:手算乘法原理
题目要求不能转换为整数处理,所以考虑用num1依次乘以num2的每一位数且后补0位,最后相加
1、若其中有一个为0,则直接输出0
2、准备一个列表和进位标识符,每次用num1的每一位数乘以num2的每一位数(均为倒序),并将倒序字符串存入列表
3、补位。根据在列表中的索引,往每个字符串前面补0位,索引数为0的个数
4、将字符串按位数进行相加(从前往后加,设置进位符,位数不够0来凑)
5、倒序输出结果

代码:

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        if num1 == '0' or num2 == '0':
            return '0'
        else:
            l = []
            for i in range(len(num2), 0, -1):#num2取1个数
                carry = 0
                snum = ""
                n2 = int(num2[i - 1])
                for j in range(len(num1), 0, -1):#num1取1个数
                    n1 = int(num1[j - 1])
                    num = n1 * n2 + carry
                    snum = snum + str(num % 10)#将个位数存入字符串
                    carry = num // 10#获得进位
                if carry != 0:
                    snum = snum + str(carry)
                l.append(snum)#加上进位符之后存入列表
            for i in range(1, len(l)):#补0位
                zeros = ""
                for j in range(i):
                    l[i] = '0' + l[i]
            carry = 0
            result = ""
            for i in range(len(l[-1])):#当前在第几位进行运算
                num = 0
                for j in range(len(l)):#循环列表的每一个字符串
                    if i >= len(l[j]):
                        num = num + 0
                    else:
                        num = num + int(l[j][i])
                num = num + carry#得到某一位上的值
                result = result + str(num % 10)#取余,得到该位置上的数字
                carry = num // 10
            if carry != 0:
                result = result + str(carry)
            return result[::-1]

在这里插入图片描述

46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。
【示例】输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1],
[3,1,2], [3,2,1] ]

尝试思路:类似回溯法
依次确定每一位置上放什么数(如图)
在这里插入图片描述
但是具体怎么实施没想出来

53. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
【示例】输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

尝试思路1:枚举
从每一位数开始,依次后加,没加一次与当前最大值比较一次,最后输出最大值

代码:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        maxs = max(nums)
        for i in range(len(nums)):
            sumn = 0
            for j in range(i, len(nums)):
                sumn += nums[j]
                if sumn > maxs:
                    maxs = sumn
        return maxs

错误:超出执行时间
原因:复杂度过高,遇到大规模案例就崩
在这里插入图片描述
看了一眼题解需要动态规划,但是不太会写,先研究一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值