力扣大厂热门面试算法题 9-11

        9. 回文数,10. 正则表达式匹配,11. 盛最多水的容器,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.08 可通过leetcode所有测试用例。

目录

9. 回文数

解题思路

完整代码

Java

Python

10. 正则表达式匹配

解题思路

完整代码

Java

Python

11. 盛最多水的容器

解题思路

完整代码

Java

Python


9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。
 

示例 1:

输入:x = 121
输出:true
示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

解题思路

  1. 负数和末尾为0的情况:负数不是回文数。除了0以外,任何末尾为0的数也不可能是回文数,因为回文数的起始数字不能为0。
  2. 反转一半数字:为了避免反转整个数字可能导致的整数溢出问题,我们只反转整数的一半。当反转的一半数字大于或等于剩余的一半数字时,就意味着已经处理了一半以上的数字。

完整代码

Java
public class Solution {public boolean isPalindrome(int x) {if (x < 0 || (x % 10 == 0 && x != 0)) {return false;}int reversedHalf = 0;while (x > reversedHalf) {reversedHalf = reversedHalf * 10 + x % 10;x /= 10;}// 当数字长度为偶数时,原始数字的一半应该等于反转后的一半数字;// 当数字长度为奇数时,去掉反转一半的末位数字(通过/10操作)后,应该等于原始数字的一半。return x == reversedHalf || x == reversedHalf / 10;}
}
Python
class Solution:def isPalindrome(self, x: int) -> bool:# 负数或者末尾为0(但不是0本身)的数不是回文数if x < 0 or (x % 10 == 0 and x != 0):return Falsereversed_half = 0while x > reversed_half:reversed_half = reversed_half * 10 + x % 10x //= 10# 对于偶数长度的数字,反转的一半应该等于剩余的一半。# 对于奇数长度的数字,去掉反转一半的末位数字(通过//10操作)后,应该等于剩余的一半。return x == reversed_half or x == reversed_half // 10

10. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

'.' 匹配任意单个字符
'*' 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

 
示例 1:

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

输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:

输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
 

提示:

1 <= s.length <= 20
1 <= p.length <= 20
s 只包含从 a-z 的小写字母。
p 只包含从 a-z 的小写字母,以及字符 . 和 *。
保证每次出现字符 * 时,前面都匹配到有效的字符

解题思路

  1. 初始化dp[0][0]True,因为空字符串与空模式是匹配的。接下来初始化dp[0][j],即当s为空字符串时p的匹配情况,只有当p的偶数位是*时可能为True
  2. 状态转移:考虑以下几种情况:
    • p[j-1]是普通字符时,只有当s[i-1]等于p[j-1]dp[i-1][j-1]True时,dp[i][j]才为True
    • p[j-1].时,它可以匹配任意字符,只要dp[i-1][j-1]Truedp[i][j]就为True
    • p[j-1]*时,需要考虑*匹配零个或多个字符的情况:
      • 匹配零个字符时,即*前面的字符被忽略,如果dp[i][j-2]True,则dp[i][j]也是True
      • 匹配一个或多个字符时,如果s[i-1]*前面的字符匹配(或者*前面是.),并且dp[i-1][j]True,则dp[i][j]也是True
  3. 返回结果:最后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 = 2; j <= p.length(); j++) {dp[0][j] = p.charAt(j-1) == '*' && dp[0][j-2];}for (int i = 1; i <= s.length(); i++) {for (int j = 1; j <= p.length(); j++) {if (p.charAt(j-1) == '.' || p.charAt(j-1) == s.charAt(i-1)) {dp[i][j] = dp[i-1][j-1];} else if (p.charAt(j-1) == '*') {dp[i][j] = dp[i][j-2] || (dp[i-1][j] && (p.charAt(j-2) == '.' || p.charAt(j-2) == s.charAt(i-1)));}}}return dp[s.length()][p.length()];}
}
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(2, len(p) + 1):dp[0][j] = p[j-1] == '*' and dp[0][j-2]for i in range(1, len(s) + 1):for j in range(1, len(p) + 1):if p[j-1] in {s[i-1], '.'}:dp[i][j] = dp[i-1][j-1]elif p[j-1] == '*':dp[i][j] = dp[i][j-2] or dp[i-1][j] and p[j-2] in {s[i-1], '.'}return dp[len(s)][len(p)]

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

解题思路

  1. 初始化:设置两个指针leftright,分别指向数组的开始和末尾。
  2. 计算容量:计算由leftright指向的线段形成的容器可以存储的水量,容量计算公式为min(height[left], height[right]) * (right - left)
  3. 移动指针:比较leftright指向的高度,移动较短的一侧的指针,因为容器的容量是由较短的边界决定的,移动较长的边界不会增加容量。
  4. 重复步骤2和3,直到leftright相遇。
  5. 最大容量:在整个过程中,记录并更新可以得到的最大容量。

完整代码

Java
class Solution {public int maxArea(int[] height) {int left = 0, right = height.length - 1;int maxArea = 0;while (left < right) {int currentArea = Math.min(height[left], height[right]) * (right - left);maxArea = Math.max(maxArea, currentArea);if (height[left] < height[right]) {left++;} else {right--;}}return maxArea;}}
Python
class Solution:def maxArea(self, height: List[int]) -> int:left, right = 0, len(height) - 1max_area = 0while left < right:# 计算当前容器的容量current_area = min(height[left], height[right]) * (right - left)max_area = max(max_area, current_area)# 移动较短的边界if height[left] < height[right]:left += 1else:right -= 1return max_area

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

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

相关文章

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭

寡姐出击&#xff01;《黑寡妇2》AI电影宣传片重磅来袭 The Black Widow returns, but darkness follows her. Black Widow 2 - Secrets buried deep will rise. A web of lies and deceit threatens her very existence. In the shadows, a new enemy lurks, waiting to strik…

一些开发外贸获客系统的代码分享

在数字化快速发展的今天&#xff0c;外贸行业也面临着前所未有的变革&#xff0c;传统的获客方式&#xff0c;如展会、广告等&#xff0c;虽然仍然有其价值&#xff0c;但随着互联网技术的发展&#xff0c;通过线上渠道获取海外客户已成为越来越多外贸企业的选择。 其中&#…

贡献法总结

贡献法的核心在于&#xff0c;分析每个元素对答案的贡献。 1.孤独的照片 4261. 孤独的照片 - AcWing题库 最暴力的做法是枚举出所有情况&#xff0c;时间复杂度是O()&#xff0c;显然会超。 我们用贡献法的方式来思考。 对于某一头牛&#xff0c;假设它为G牛&#xff0c;它…

【计网】TCP协议安全与风险:深入探讨网络通信的基石

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 &#x1f310;前言 &#x1f512;正文 TCP (Transmission Control Protocol): UDP (User Datagram Protocol): HTTP (Hypertext Transfer …

“一键批量自定义重命名:轻松驾驭文件海洋,让管理变得如此简单!“

在信息爆炸的时代&#xff0c;我们每天都会接触到大量的文件&#xff0c;从文档、图片到视频、音频等&#xff0c;各种类型、各种格式的文件充斥着我们的电脑和移动设备。如何有效地管理和组织这些文件&#xff0c;成为了我们不得不面对的问题。今天&#xff0c;我们为您带来了…

掌握Python操作Word:从基础到高级全覆盖

掌握Python操作Word&#xff1a;从基础到高级全覆盖 引言Python操作Word的基础文档的创建与打开文档的基本操作 创建和打开Word文档创建新的Word文档打开现有文档读取文档内容修改现有文档 编辑文档内容添加和编辑文本设置格式插入标题 处理文档结构操作段落列表的处理表格的操…

高校水电预付费系统有什么作用?

Hey小伙伴们&#xff0c;今天来聊聊咱们大学里的一个超级实用的设施——水电预付费系统&#xff01;你是不是还在为每个月的水电账单烦恼呢&#xff1f;别担心&#xff0c;这个系统就是你的生活小帮手&#xff01; 首先&#xff0c;想象一下这 样的场景&#xff1a;开学初&…

网站建设大概需要多少钱?费用是多少?怎么样

1、网站建设详细报价单。 建立一个网站需要多少钱&#xff1f; 公司不同&#xff0c;地点不同&#xff0c;技术不同&#xff0c;需求不同&#xff0c;价格也不同。 1、不要尝试用几百块钱建立一个网站&#xff0c;2、几千块做一个普通的网站&#xff0c;3、几万块做一个更好的…

PostgreSQL容器安装

docker中的centos7中安装 选择对应的版本然后在容器中的centos7中执行下面命令 但是启动容器的时候需要注意 开启端口映射开启特权模式启动init进程 docker run -itd --name centos-postgresql -p 5433:5432 --privilegedtrue centos:centos7 /usr/sbin/init 启动然后进入后先…

【JAVA】优化if else的几种方式

在代码编写初期&#xff0c;我们写出来的代码&#xff0c;脉络清晰&#xff0c;结构简单。可随着bug或者新需求的出现&#xff0c;状态变得越来越多&#xff0c;只能不停地加else来区分&#xff0c;久而久之&#xff0c;判断的次数越来越多&#xff0c;嵌套的层数也越来越深&am…

centos 系统 yum 无法安装(换国内镜像地下)

centos 系统 yum 因为无法连接到国外的官网而无法安装&#xff0c;问题如下图&#xff1a; 更换阿里镜像&#xff0c;配置文件路径&#xff1a;/etc/yum.repos.d/CentOS-Base.repo&#xff08;如果目录有多余的文件可以移动到子目录&#xff0c;以免造成影响&#xff09; bas…

STM32 | Proteus 8.6安装步骤(图文并茂)

01 Proteus 8.6 简介 Proteus 8.6 是一款功能强大的电子设计自动化软件&#xff0c;广泛用于电路设计、仿真和PCB布局。它为电子工程师和学生提供了一个全面的工具集&#xff0c;用于设计和验证各种电路和电子设备。Proteus 8.6 包括了以下几个主要特性&#xff1a; 1. 电路设…