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
错误:超出执行时间
原因:复杂度过高,遇到大规模案例就崩
看了一眼题解需要动态规划,但是不太会写,先研究一下