力扣大厂热门面试算法题 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.rhkb.cn/news/278989.html

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

相关文章

计算机网络的分类

目录 <计算机网络的分类> 1.按网络覆盖范围分 1)个人区域网PAN 2)局域网 3)城域网 4)广域网 5)互联网 2.按传输介质分类 3.按网络传输技术分类 4.按网络的使用性质分类 <计算机网络的分类> 计算机网络分类的方法很多&#xff0c;可以从不同的角度观察网络…

如何使用IDE端通义灵码

如何使用IDE端通义灵码 第一步&#xff1a;安装IDE插件&#xff08; VS Code 和 JetBrains 二选一&#xff09; 如何下载安装VS Code &#xff1a;https://code.visualstudio.com 如何下载安装JetBrains&#xff1a;https://www.jetbrains.com/idea/download 第二步&#x…

Python 中异常处理介绍

异常处理是编程中一个非常重要的概念&#xff0c;它允许程序在出现错误时进行适当的处理&#xff0c;而不是直接崩溃。在 Python 中&#xff0c;异常处理是通过 try、except、finally 和 raise 语句来实现的。本文将详细介绍 Python 中的异常处理机制。 异常的基本概念 异常是在…

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…

PHP+MySQL开发组合:多端多商户DIY商城源码系统 带完整的搭建教程以及安装代码包

近年来&#xff0c;电商行业的迅猛发展&#xff0c;越来越多的商户开始寻求搭建自己的在线商城。然而&#xff0c;传统的商城系统往往功能单一&#xff0c;无法满足商户个性化、多样化的需求。同时&#xff0c;搭建一个功能完善的商城系统需要专业的技术团队和大量的时间成本&a…

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…

【科普】气体检测仪使用时常见的几点误区,你占了几条?

气体检测仪的作用是检测环境中的气体浓度&#xff0c;及时发现并报警&#xff0c;以确保人员和设备的安全。气体检测仪在多个领域发挥着重要作用。 首先&#xff0c;它是对工业安全的重要保障。在生产现场&#xff0c;有毒、可燃或有爆炸性的气体泄漏可能导致严重的后果。气体检…

LabVIEW湍流等离子体束热效率优化

LabVIEW湍流等离子体束热效率优化 利用LabVIEW虚拟仪器技术&#xff0c;对湍流等离子体束的热效率进行了实时监测与优化&#xff0c;提高其在材料处理领域的应用效率和精度。通过双进气湍流等离子体发生器&#xff0c;实现了在不同工作参数下对热效率的实时在线监测&#xff0…

【Streamlit学习笔记】实现包含多个sheet的excel文件下载

1、什么是Streamlit Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序&#xff0c;官网链接 Streamlit Streamlit API链接 API reference 实际项目中遇到的问题&#xff1a;包含多个sheet的excel文件下载&#xff0c;下面将给…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…

递推算法C++

所谓递推&#xff0c;是指从已知的初始条件出发&#xff0c;依据某种递推关系&#xff0c;逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定&#xff0c;或是通过对问题的分析与化简后确定。从已知条件出发逐步推到问题结果&#xff0c;此种方法叫顺推…

【绘图案例-drawrect Objective-C语言】

一、接下来,我们来说drawrect:这个方法, 1.我们把之前的copy这个代码,复制粘贴一份,改个名字, 来个“05-drawrect”, 然后呢,关于这个drawrect: drawrect:啊,我们分几点来写, 1)首先:代码为什么要写在drawrect:当中, 2)rect参数的含义:也就是说,这个rect,…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

第四百一十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Windows Server 各版本搭建远程访问 / VPN 服务器实现 VPN 连接(03~19)

一、Windows Server 2003 开机后点击添加或删除角色 点击下一步 勾选自定义&#xff0c;点击下一步 点击 远程访问/VPN 服务器&#xff0c;点击下一步 点击下一步 点击下一步 勾选自定义&#xff0c;点击下一步 选择配置类型&#xff0c;点击下一步 点击完成 点击是 点击完成…

突破编程_前端_ACE编辑器(概述)

1 ACE 框架简介 ACE 框架是一个强大且灵活的前端文本编辑器框架&#xff0c;它提供了一套全面的 API 和丰富的功能&#xff0c;使得开发者能够轻松地在 Web 应用中集成功能强大的代码编辑器。ACE 编辑器不仅适用于在线代码编辑&#xff0c;还广泛应用于文档编辑、实时协作、富…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…