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

news2025/2/24 19:03:16

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,直接返回0
            return "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,直接返回0
            return "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] = True

        for 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 = 0
        maxReach = 0
        end = 0

        for i in range(len(nums) - 1):  # 不需要遍历到最后一个元素
            maxReach = max(maxReach, i + nums[i])
            if i == end:
                end = maxReach
                steps += 1

        return 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.coloradmin.cn/o/1528985.html

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

相关文章

【JAVA快速编写UI】 Java 编写一个编码转换和加解密工具,可以创建一个简单的 GUI 应用程序(例子)

EncodingDecodingTool/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── rockmelodies/ │ │ │ └── encodingdecodingtool/ │ │ │ ├── MainApp.java │ │ │ …

MongoDB启动报错

spring boot 引入MongoDB启动报错 java.lang.IllegalStateException: Failed to introspect Class [io.micrometer.core.instrument.binder.mongodb.DefaultMongoConnectionPoolTagsProvider] from ClassLoader [sun.misc.Launcher$AppClassLoader18b4aac2] at org.springfra…

初识STL(标准模板库)

目录 ​编辑 什么是STL STL的版本 STL的六大组件 如何学习STL STL的优势 STL的缺陷 ⭐什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法…

C语言笔记:函数与程序结构

目录 ACM金牌带你零基础直达C语言精通-课程资料 一.作用域的基本概念 二.函数 1. 函数的定义和使用 2.为什么一定要有函数结构 3.形参与实参 4.函数的声明和定义 5.递归函数 此代码中递归函数执行流程&#xff1a; 练习&#xff1a;求斐波那契数列第n项的值&#xff1a; 欧几里…

洛谷_P1104 生日_python写法

P1104 生日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点&#xff1a; 还是自定义规则的排序&#xff0c;然后这里还有python中如何在一行中输入多种类型的数据。 n int(input()) data [] num 1 for i in range(n):img list(input().split())s img[0]y int(img…

【unity与android的交互】移动游戏发布更安心!Unity安卓平台打包相关的常见参数全详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

深度学习500问——Chapter03:深度学习基础(3)

文章目录 3.5 Batch Size 3.5.1 为什么需要 Batch size 3.5.2 Batch Size 值的选择 3.5.3 在合理范围内&#xff0c;增大Batch Size有何好处 3.5.4 盲目增大 Batch Size有何坏处 3.5.5 调节Batch Size对训练效果影响到底如何 3.6 归一化 3.6.1 归一化含义 3.6.2 为什么…

大模型知识库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 1. 下载Langchain-chatchat git clone https://github.com/chatchat-space/Langchain-Chatchat/ 2. 下载大模型和embe…

打开Railway神奇大门:Railway免费注册部署全面教程

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

React——开发者工具

浏览器插件&#xff1a;谷歌浏览器插件react-devtools 方式1&#xff1a;chrome应用商店添加 方式2&#xff1a;下载安装包放在浏览器上

Redis缓存穿透的几种解决方案

目录 缓存穿透原理&#xff1a; 缓存穿透一般有几种解决方案&#xff1a; 1.缓存空值 2.使用锁 3.布隆过滤器 优缺点 布隆过滤器误判理解 布隆过滤器的简单使用流程 4.组合方案 那么当我们高并发的访问短链接或者人为的去穿透的时候呢&#xff1f; 最近做项目遇到了缓…

SpringBoot自动配置

EnableAutoConfiguration源码解析SpringBoot常用条件注解源码解析SpringBoot之Mybatis自动配置源码解析SpringBoot之AOP自动配置源码解析SpringBoot Jar包启动过程源码解析 SpringBoot2.6.6源码地址&#xff1a;SpringBoot-2.6.6: SpringBoot2.6.6 注解详解 SpringBootConfig…

【技术栈】Spring Cache 简化 Redis 缓存使用

​ SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 ​ 本文封面由 凯楠&#x1f4f8; 友情提供 目录 本栏传送门 1. Spring Cache 介绍 2. Spring Cache 常用注解 注&#xff1a;手机端浏览本文章…

java入门 -输入和输出

输入输出 开发中大量会使用输入和输出&#xff0c;今天来总结一下Java语法阶段常使用的输入和输出。 输出 System.out 控制台输出信息。 不换行显示一行&#xff1a; System.out.print( ); System.out.print("hello "); System.out.print("java!");运行结…

如何强健“伙伴+华为”体系?华为用六大升级给出答案

聚拢企业内部资源&#xff0c;可以成事&#xff1b;而聚拢企业内外资源&#xff0c;则可成势。 华为如何在NA、商业和分销三大赛道聚拢伙伴之力成势&#xff1f;伙伴又如何与华为一起顺势而为&#xff0c;获得发展和收益&#xff1f;这是在一年一度的“华为中国合作伙伴大会”…

MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程

文章目录 前言5.9 Mapper方法的调用过程5.10 小结 前言 上一节【MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取】已经知道&#xff0c;调用SqlSession对象的getMapper(Class)方法&#xff0c;传入指定的Mapper接口对应的Class对象…

BUU [MRCTF2020]套娃

BUU [MRCTF2020]套娃 开题&#xff0c;啥也没有。 查看网页源代码发现后端源代码&#xff1a; <?php //1st $query $_SERVER[QUERY_STRING];if( substr_count($query, _) ! 0 || substr_count($query, %5f) ! 0 ){die(Y0u are So cutE!); }if($_GET[b_u_p_t] ! 23333 &am…

Vue核心知识点 -Vue2响应式系统是基于什么实现的、以及会产生什么问题和解决方案

一、概念 在Vue 2中&#xff0c;响应式系统是基于Object.defineProperty实现的。它通过劫持对象的属性来实现数据的响应式更新。 当你将一个对象传递给Vue实例的data选项时&#xff0c;Vue会遍历对象的每个属性&#xff0c;并使用Object.defineProperty方法将其转换为getter和s…

项目总结报告-word

2 项目工作成果 2.1 交付给用户的产品 2.2 交付给研发中心的产品 2.2.1 代码部分 2.2.2 文档部分 2.3 需求完成情况与功能及性能符合性统计 2.3.1 需求完成情况统计 2.3.2 功能符合性分析 2.3.3 性能符合性分析 3 项目工作分析 3.1 项目计划与进度实施分析 3.1.1 开发进度 3.1.…

2000-2021年各省研发强度数据(原始数据+计算结果)(无缺失)

2000-2021年各省研发强度数据&#xff08;原始数据计算结果&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;RD经费内部支出&#xff08;万元&#xff09;、国内生产总值、研发强度 3、范围&#xff1a;31省 4、来源&#…