力扣大厂热门面试算法题 43-45

43. 字符串相乘,44. 通配符匹配,45. 跳跃游戏 II,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.18 可通过leetcode所有测试用例。

目录

43. 字符串相乘

解题思路

完整代码

Python

Java

44. 通配符匹配

解题思路

完整代码

Python

Java

45. 跳跃游戏 II

解题思路

完整代码

Python

Java


43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

解题思路

        可以使用一个被称为“竖式乘法”的方法,这是一种我们在小学学过的乘法手算方法。由于题目要求不能直接将字符串转换为整数进行计算,我们需要模拟这个过程。整体思路如下:

  1. 初始化结果字符串:最开始,我们可以将结果初始化为"0",因为任何数与0相乘都是0。
  2. 逐位相乘:从num2的最低位开始,每一位与num1相乘,得到一个临时的乘积。注意,我们需要处理乘积中的进位问题。
  3. 处理进位:将每一步的乘积加到最终的结果上时,同样需要处理进位问题。
  4. 结果累加:将每次乘法的结果累加到最终结果中,注意,由于是逐位相乘,我们需要在结果的右侧添加相应数量的0(这模拟了竖式乘法中的位移)。
  5. 去除前导零:最终,我们可能会得到一个有前导零的字符串,需要去掉这些前导零。

完整代码

Python
class Solution:def multiply(self, num1: str, num2: str) -> str:if num1 == "0" or num2 == "0":  # 如果有一个数为0,直接返回0return "0"result = [0] * (len(num1) + len(num2))  # 初始化结果数组,最大长度为两个字符串长度之和# 逐位相乘for i in range(len(num1) - 1, -1, -1):for j in range(len(num2) - 1, -1, -1):mul = (ord(num1[i]) - ord('0')) * (ord(num2[j]) - ord('0'))  # 计算每一位的乘积sum = mul + result[i + j + 1]  # 加上之前的结果result[i + j + 1] = sum % 10  # 更新当前位result[i + j] += sum // 10  # 处理进位# 将结果数组转换为字符串,同时去除前导零result_str = ''.join(map(str, result))return result_str.lstrip('0')
Java
public class Solution {public String multiply(String num1, String num2) {if (num1.equals("0") || num2.equals("0")) {  // 如果有一个数为0,直接返回0return "0";}int[] result = new int[num1.length() + num2.length()];  // 初始化结果数组// 逐位相乘for (int i = num1.length() - 1; i >= 0; i--) {for (int j = num2.length() - 1; j >= 0; j--) {int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');int sum = mul + result[i + j + 1];  // 加上之前的结果result[i + j + 1] = sum % 10;  // 更新当前位result[i + j] += sum / 10;  // 处理进位}}// 将结果数组转换为字符串,同时去除前导零StringBuilder resultStr = new StringBuilder();for (int num : result) {if (!(resultStr.length() == 0 && num == 0)) {  // 跳过前导零resultStr.append(num);}}return resultStr.length() == 0 ? "0" : resultStr.toString();}
}

44. 通配符匹配

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 '?' 和 '*' 匹配规则的通配符匹配:

  • '?' 可以匹配任何单个字符。
  • '*' 可以匹配任意字符序列(包括空字符序列)。

判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。

 

示例 1:

输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa", p = "*"
输出:true
解释:'*' 可以匹配任意字符串。

示例 3:

输入:s = "cb", p = "?a"
输出:false
解释:'?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

提示:

  • 0 <= s.length, p.length <= 2000
  • s 仅由小写英文字母组成
  • p 仅由小写英文字母、'?' 或 '*' 组成

解题思路

        通配符匹配是一个经典问题,我们可以通过动态规划(DP)来解决这个问题。动态规划的基本思想是用一个二维数组dp[i][j]来表示字符串s的前i个字符和模式p的前j个字符是否匹配。下面是解决这个问题的步骤:

  1. 初始化:首先,我们初始化dp[0][0]true,因为两个空字符串是匹配的。对于dp[0][j],如果p的前j个字符都是*,那么它们可以匹配空字符串,因此dp[0][j]也为true
  2. 填充DP表:接下来,我们按行填充这个DP表。对于每一对(i, j),我们需要根据s[i-1]p[j-1]的关系来更新dp[i][j]
    • 如果s[i-1] == p[j-1]或者p[j-1] == '?',则dp[i][j] = dp[i-1][j-1]
    • 如果p[j-1] == '*',则dp[i][j] = dp[i][j-1](不使用*字符匹配)或dp[i-1][j](使用*字符匹配s[i-1]以及它之前的字符)。
  3. 返回结果:最后,dp[s.length()][p.length()]就是整个问题的答案,表示sp是否完全匹配。

完整代码

Python
class Solution:def isMatch(self, s: str, p: str) -> bool:dp = [[False] * (len(p) + 1) for _ in range(len(s) + 1)]dp[0][0] = Truefor j in range(1, len(p) + 1):if p[j-1] == '*':dp[0][j] = dp[0][j-1]for i in range(1, len(s) + 1):for j in range(1, len(p) + 1):if p[j-1] == '*':dp[i][j] = dp[i][j-1] or dp[i-1][j]elif p[j-1] == '?' or s[i-1] == p[j-1]:dp[i][j] = dp[i-1][j-1]return dp[len(s)][len(p)]
Java
public class Solution {public boolean isMatch(String s, String p) {boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];dp[0][0] = true;for (int j = 1; j <= p.length(); j++) {if (p.charAt(j-1) == '*') {dp[0][j] = dp[0][j-1];}}for (int i = 1; i <= s.length(); i++) {for (int j = 1; j <= p.length(); j++) {if (p.charAt(j-1) == '*') {dp[i][j] = dp[i][j-1] || dp[i-1][j];} else if (p.charAt(j-1) == '?' || s.charAt(i-1) == p.charAt(j-1)) {dp[i][j] = dp[i-1][j-1];}}}return dp[s.length()][p.length()];}
}

45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

解题思路

        可以使用贪心算法。基本思想是,在每一步中都尽可能地跳得更远,但同时保留当前能达到的最远距离内的下一步跳跃能达到的最远距离。具体步骤如下:

  1. 初始化变量:创建几个变量,steps用于记录跳跃次数,maxReach用于记录当前步骤内能到达的最远距离,end用于记录这一跳能到达的最远位置。
  2. 遍历数组:从数组的第一个元素开始遍历,直到倒数第二个元素(因为最后一个元素是我们的目的地,不需要再跳跃)。
  3. 更新最远距离:在遍历的每一步中,更新能达到的最远距离maxReach = max(maxReach, i + nums[i]),其中i是当前位置,nums[i]是从当前位置能跳跃的最大长度。
  4. 到达跳跃点:当我们到达上一次跳跃确定的最远位置end时,意味着需要进行下一次跳跃,此时更新end为当前能达到的最远距离maxReach,并增加跳跃次数steps++
  5. 返回结果:当遍历完成时,steps即为到达数组末尾的最小跳跃次数。

完整代码

Python
class Solution:def jump(self, nums: List[int]) -> int:steps = 0maxReach = 0end = 0for i in range(len(nums) - 1):  # 不需要遍历到最后一个元素maxReach = max(maxReach, i + nums[i])if i == end:end = maxReachsteps += 1return steps
Java
public class Solution {public int jump(int[] nums) {int steps = 0;int maxReach = 0;int end = 0;for (int i = 0; i < nums.length - 1; i++) {  // 不需要遍历到最后一个元素maxReach = Math.max(maxReach, i + nums[i]);if (i == end) {end = maxReach;steps++;}}return steps;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的中医学习服务管理系统

摘 要 随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存…

汽车制造业供应商管理会面临哪些问题?要如何解决?

汽车行业的供应链是及其复杂的&#xff0c;并且呈全球化分布&#xff0c;企业在知识产权方面的优势很可能是阶段性的。企业需要持续保持领先&#xff0c;将面临巨大的挑战&#xff0c;尽快地将产品推向市场是保持领先的唯一途径。然而&#xff0c;如果没有正确的方式去实现安全…

matlab 最小二乘拟合圆柱

目录 一、算法原理1、算法简介2、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法简介 圆柱拟合步骤主要包括两步: 一是确定柱面模型参数初始值; 二是…

线性电压调节器的使用---MC7915BTG

MC7915BTG是一款固定输出负线性电压调节器。还提供了MECL系统中常用的一种额外电压选项。MC7915BTG线性电压调节器15V的固定输出电压&#xff0c;采用限流、热关闭和安全区域补偿&#xff0c;使其在大多数操作条件下都非常坚固。有了足够的散热&#xff0c;它们可以提供超过1.0…

关系数据库标准语言SQL

1.SQL概述 1.1基本表&#xff08;Base table&#xff09; 实际存储在数据库中的表SQL中一个关系就对应一个基本表基本表可以有若干个索引基本表的集合组成关系模式&#xff0c;即全局概念模式&#xff08;数据的整体逻辑结构&#xff09; 1.2 存储文件 存储文件和相关索引组…

LeetCode 热题 100 | 回溯(三)

目录 1 131. 分割回文串 2 51. N 皇后 菜鸟做题&#xff0c;语言是 C&#xff0c;感冒好了 ver. 1 131. 分割回文串 题眼&#xff1a;给你一个字符串 s&#xff0c;请你将 s 分割 成一些子串。 根据题眼可知&#xff0c;我们需要做的是将字符串 s 连续分割 为几段&#…

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

Redis各场景应用集合

应用场景 1、缓存&#xff08;Cache&#xff09;,分布式缓存 有一些存储于数据库中的数据会被频繁访问&#xff0c;如果频繁的访问数据库&#xff0c;数据库负载会升高&#xff0c;同时由于数据库IO比较慢&#xff0c;应用程序的响应会比较差。此时&#xff0c;如果引入Redis来…

面试笔记——Redis(使用场景、面临问题、缓存穿透)

Redis的使用场景 Redis&#xff08;Remote Dictionary Server&#xff09;是一个内存数据结构存储系统&#xff0c;它以快速、高效的特性闻名&#xff0c;并且它支持多种数据结构&#xff0c;包括字符串、哈希表、列表、集合、有序集合等。它主要用于以下场景&#xff1a; 缓…

java新手练习-类的继承调用(接口,抽象类,构造函数)和枚举定义方法

1.继承 父类可以调用子类实例对象,(对于调用抽象类必须使用继承) 模版 //抽象定义一个父类抽象类 abstract class FatherAbstract{void showFatherAbstract(String color, String name, int age, double serail_abstract){System.out.println("color " color &…

Java基础-lambda表达式

lambda表达式 前言前置知识λ小故事函数式编程起源: λ演算法 概念Lambda && 匿名类无参类型的简写带参函数的简写 简写的依据自定义函数接口lambda && 匿名类JVM层面区别匿名内部类实现Lambda表达式实现推论,this引用的意义 lambda && 集合Collection…

代码随想录阅读笔记-字符串【右旋字符串】

题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符串 "a…

【STL源码剖析】【2、空间配置器——allocator】

文章目录 1、什么是空间配置器&#xff1f;1.1设计一个简单的空间配置器&#xff0c;JJ::allocator 2、具备次配置力( sub-allocation)的 SGI 空间配置器2.1 什么是次配置力2.2 SGI标准的空间配置器&#xff0c;std::allocator2.2 SGI特殊的空间配置器&#xff0c;std::alloc2.…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

OSPF外部路由及外部路由引入过程

OSPF自治域&#xff08;同运行了OSPF协议的设备&#xff09;&#xff1b;O_ASE——代表OSPF的外部路由&#xff08;优先级150&#xff09;&#xff1b;1类LSA除了描述本身的直连状态、还描述本身的设备角色。 ASBR——自治系统边界路由器&#xff1b;同种路由协议也可做路由引…

谁能成为OpenAI的现实竞争对手吗?

文 | BFT机器人 前言&#xff1a; 自从与ChatGPT一起出现以来&#xff0c;OpenAI一直主导着人工智能市场&#xff0c;但它仍处于早期阶段。人工智能的历史可以追溯到几十年之前。但2022年11月ChatGPT的发布使生成式人工智能 (GenAI) 成为人们关注的焦点。从那时起&#xff0c;…

汽车研发项目管理数字化平台之阀门管理

阀门管理&#xff0c;在汽车研发流程中占据着举足轻重的地位&#xff0c;是确保项目精细化、系统化的关键所在。这一机制的核心在于通过设立“阀门”来控制和管理研发流程中的关键节点&#xff0c;从而确保项目在质量、进度和资源等方面均符合预期目标。在汽车行业高度竞争和持…

学习网络编程No.14【数据链路层ARP理解】

引言&#xff1a; 北京时间&#xff1a;2024/3/14/9:20&#xff0c;简单聊一聊我的日常。昨天晚上十点左右更新完新的一篇文章&#xff0c;回到宿舍简简单单花了个两首歌的时间洗了个澡&#xff0c;然后为了保持形象吹了个头发&#xff0c;哈哈哈&#xff01;当然对比以前的我…

Uniapp + SpringBoot 开发微信H5项目 微信公众号授权登录 JAVA后台(一、配置使用微信公众平台测试公众号)

申请测试号进行调试开发&#xff0c;测试号拥有大部分服务号有的接口权限。 一、接口配置信息填写校验 这里需要填写一个URL和一个Token验证字符串 我这里是用了natapp内网穿透 将本地的后台8080端口服务映射到了 http://x7zws8.natappfree.cc https://natapp.cn/在natapp官网…

Linux(Ubuntu)下安装paddleocr详细教程

PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库&#xff0c;助力开发者训练出更好的模型&#xff0c;并应用落地。 1、 Ubuntu安装教程&#xff1a; 首先安装paddlepaddle&#xff1a;pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple 一般此项不会报错…