LeetCode 1164, 125, 94

news2024/10/23 2:47:07

目录

  • 1164. 指定日期的产品价格
    • 题目链接
    • 要求
    • 知识点
    • 思路+代码
  • 125. 验证回文串
    • 题目链接
    • 标签
    • 简单版
      • 思路
      • 代码
    • 复杂版
      • 思路
      • 代码
  • 94. 二叉树的中序遍历
    • 题目链接
    • 标签
    • 递归
      • 思路
      • 代码
    • 迭代
      • 思路
      • 代码

1164. 指定日期的产品价格

题目链接

1164. 指定日期的产品价格

  • Products的字段为product_idnew_pricechange_date

要求

  • 编写一个解决方案,找出在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。
  • 任意顺序 返回结果表。

知识点

  1. in:有一次限制多个字段的功能。例如:
where
	(id, num)
in (
	select
		id,
		num
	from
		tb_stock
)

此语句将idnum限制到从tb_stock表中查询到的结果,注意 ()中的字段数 与 子表查询到的字段数 必须是相同的。

  1. max():求最大值的函数。
  2. ifnull():共传入两个参数,如果第一个参数是null,则返回第二个参数。例如ifnull(null, 'no')将会返回no
  3. left join:左连接,将 左表的所有数据 和 右表与左表的交集数据 查询出来。
  4. distinct:对字段的相同值进行去重。

思路+代码

找出在 2019-08-16 时全部产品的价格,
所以需要先查出更新的产品的在 2019-08-16 之前的最迟更新日期max_change_date

select
	product_id,
	max(change_date) max_change_date
from
	Products
where
	change_date <= '2019-08-16'
group by
	product_id

然后再求出这些产品在最迟更新日期max_change_date更新的价格new_price

select
	product_id,
	new_price
from
	Products
where (
	product_id,
	change_date
) in (
	select
		product_id,
		max(change_date) max_change_date
	from
		Products
	where
		change_date <= '2019-08-16'
	group by
		product_id
)

最后查出所有的产品id,然后将查到new_price的产品的价格返回,将没有查到new_price的产品按价格为10返回。注意,由于要查出所有的产品id,然后再与 查到new_price部分产品id 进行多表查询,所以得使用 外连接,本题使用了 左外连接 left join

select
    id_cnt.product_id,
    ifnull(new_price, 10) price
from (
        select
            distinct product_id
        from
            Products
    ) id_cnt
left join (
        select
            product_id,
            new_price
        from
            Products
        where (
        	product_id,
            change_date
        ) in (
            select
                product_id,
                max(change_date) max_change_date
            from
                Products
            where
                change_date <= '2019-08-16'
            group by
                product_id
        )
    ) price_cnt
on
    id_cnt.product_id = price_cnt.product_id

125. 验证回文串

题目链接

125. 验证回文串

标签

双指针 字符串

简单版

思路

本题的思路很明确,先将所有大写字符转换为小写字符,并移除所有非字母数字字符,然后再对剩下的字符串进行是否是回文串的判断。

是否是回文串可以使用双指针的做法,左指针left从字符串头部向尾部遍历,右指针right从字符串尾部向头部遍历,直到 两个指针相遇 或 左指针的值 比 右指针的值 大,如果发现左指针和右指针指向的字符不相同,则返回false;若能退出遍历,则说明这个字符串是一个回文串,返回true

代码

class Solution {
    public boolean isPalindrome(String s) {
        s = s.toLowerCase(); // 将所有大写字符转换为小写字符
        s = removeNonAlphaOrDight(s); // 移除所有非字母数字字符
        char[] chars = s.toCharArray();
        int left = 0, right = chars.length - 1;
        while (left < right) {
            if (chars[left] != chars[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
    // 移除字符串s中的所有非字母数字字符
    private String removeNonAlphaOrDight(String s) {
        char[] chars = s.toCharArray();
        StringBuilder builder = new StringBuilder();
        for (char ch : chars) {
            if (Character.isLetterOrDigit(ch)) {
                builder.append(ch);
            }
        }
        return builder.toString();
    }
}

复杂版

思路

简单版的执行用时比较长,因为对源字符串进行了 转换 和 移除 的操作。如果不想浪费这些时间,就得在 指针 和 判断 这两个点下功夫:当指针指向 非字符数字字符(空格也是非字符数字字符) 时跳过这个字符,并且需要 在判断左右指针指向的字符是否相等前 将字符转化为小写。

代码

class Solution {
    public boolean isPalindrome(String s) {
        char[] chars = s.toCharArray();
        int left = 0, right = chars.length - 1;
        while (left < right) {
            if (!Character.isLetterOrDigit(chars[left])) {
                left++;
                continue;
            }
            if (!Character.isLetterOrDigit(chars[right])) {
                right--;
                continue;
            }
            
            char leftChar = Character.toLowerCase(chars[left]);
            char rightChar = Character.toLowerCase(chars[right]);
            if (leftChar != rightChar) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

94. 二叉树的中序遍历

题目链接

94. 二叉树的中序遍历

标签

栈 树 深度优先搜索 二叉树

递归

思路

中序遍历就是先遍历本节点的左子节点,然后处理本节点的值,最后遍历本节点的右子节点

例如对于下面这个二叉树:
二叉树

中序遍历这个二叉树的结果是[1, 2, 3, 4, 5, 6, 7],过程为:

从节点4开始
往节点2走
往节点1走
往节点1的左子节点走,发现是null
返回到节点1,输出节点1的值
往节点1的右子节点走,发现是null
返回到节点1,返回到节点2,输出节点2的值
往节点3走
往节点3的左子节点走,发现是null
返回到节点3,输出节点3的值
往节点3的右子节点走,发现是null
返回到节点2,返回到节点4,输出节点4的值
往节点6走
往节点5走
往节点5的左子节点走,发现是null
返回到节点5,输出节点5的值
往节点5的右子节点走,发现是null
返回到节点6,输出节点6的值
往节点7走
往节点7的左子节点走,发现是null
返回到节点7,输出节点7的值
往节点7的右子节点走,发现是null
返回节点6,返回节点4,完毕

理解如上的过程后就清晰了,使用递归将此过程模拟一遍就是如下代码:

代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }
    private void inorder(TreeNode curr, List<Integer> res) {
        if (curr == null) { // 如果遇到空节点
            return; // 直接返回
        }
        inorder(curr.left, res); // 先遍历左子节点
        res.add(curr.val); // 再处理本节点的值
        inorder(curr.right, res); // 最后遍历右子节点
    }
}

迭代

思路

使用递归能做出来的题,使用迭代也可以,只不过迭代比较难罢了

对二叉树的前序遍历、中序遍历和后序遍历本质上都是深度优先搜索,即遍历时不是一层一层遍历,而是顺着一个方向走到头,然后再回过头来处理这些值。对于这样的遍历,可以使用 将递归转化为迭代:顺着一个方向走时先将这些节点存起来,然后再弹出最近保存的节点进行处理。

递归的思想和迭代的思想是一样的,只不过实现方式不同,迭代时得分类讨论

当遍历的节点curr不为null时,就先将本节点curr加入栈stack中,然后往左子节点curr.left遍历;

否则遍历的节点currnull,此时还得根据 最近一次加入栈的节点peek = stack.peek() 的右子节点的不同进行分类讨论。

只有在没遍历右子节点时才需要对本节点进行操作(这是中序遍历的思想),当它的右子节点peek.right不是最近一次弹出栈的节点pop时,说明此时还没有遍历右子节点,应该操作本节点,然后弹出并记录本节点pop = stack.pop();当它的右子节点peek.rightnull时,也可以将其看作没有遍历右子节点的情况,操作本节点,然后弹出并记录本节点pop = stack.pop();如果不是以上两种情况,则是peek.right是最近一次弹出栈的节点pop的情况,这意味着已经遍历过右子节点了,只需要弹出并记录本节点pop = stack.pop()即可。

分类讨论到处结束,如果还不是很懂,就看看代码吧。

代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        LinkedList<TreeNode> stack = new LinkedList<>();
        List<Integer> res = new ArrayList<>();
        TreeNode curr = root; // 当前节点
        TreeNode pop = null; // 最近一次弹出栈的节点
        while (!stack.isEmpty() || curr != null) {
            if (curr != null) { // 如果这个节点不为null
                stack.push(curr); // 将这个节点保存到栈中
                curr = curr.left; // 让节点往左子节点走
            } else { // 此时对应某节点的左子节点为null的情况
                TreeNode peek = stack.peek(); // 查看最近一次加入栈中的节点
                if (peek.right == null) { // 没有右子节点 也算 右子节点没有遍历
                    res.add(peek.val); // 处理本节点的值
                    pop = stack.pop(); // 将本节点从栈中弹出,并保存它
                } else if (peek.right != pop) { // 此时还没有遍历右子节点
                    res.add(peek.val); // 处理本节点的值
                    curr = peek.right; // 将本节点从栈中弹出,并保存它
                } else { // 此时 最近一次弹出栈的节点 是 最近一次加入栈的节点的右子节点,表示已经处理完了右子节点
                    pop = stack.pop(); // 将本节点弹出,并保存它
                }
            }
        }
        return res;
    }
}

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

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

相关文章

LVGL使用GUI Guider配置STM32界面详细笔记教程

0、说明 接着前面几篇博客对LVGL的使用和介绍&#xff0c;这篇博客主要是使用和介绍快速配置LVGL图形界面编程的工具&#xff0c;GUI Guider。本文使用的工程代码&#xff0c;均是基于前几篇博客的基础上的&#xff0c;如需下载已配置好的LVGL-MCU工程环境&#xff0c;可通过如…

docker启动nacos挂载目录并修改配置文件

1 通过 Docker 拉取 nacos 镜像 docker pull nacos/nacos-server:v2.1.22 创建宿主机挂载目录 # 用于挂载 nacos 的日志 mkdir -p /mydata/nacos_home/logs/ # 用于挂载 nacos 的配置 mkdir -p /mydata/nacos_home/conf/ # 用于挂载 nacos 的数据 mkdir -p /mydata/nacos_hom…

接口联调测试工作总结

接口联调测试工作已经告一段落&#xff0c;现在总结如下: 1、首先接口联调测试的价值 2、接口联调要有工作思路 3、接口联调工作准备 4、接口联调测试数据设计 5、接口联调脚本研发 6、脚本联调测试 测试业务本身需要接口联调调用 独立接口正确&#xff0c;但有可能接口…

三甲硅烷基胺(TSA)可用作半导体前驱体材料 南大光电为我国代表企业

三甲硅烷基胺&#xff08;TSA&#xff09;可用作半导体前驱体材料 南大光电为我国代表企业 三甲硅烷基胺&#xff08;TSA&#xff09;是一种无机化合物&#xff0c;分子式为&#xff08;SiH3&#xff09;3N&#xff0c;其外观呈无色流动性液体。三甲硅烷基胺具有易水解、自燃性…

Java面向对象的三大特性之一——继承

目录 一、继承概念 二、为什么要继承 三、继承语法&#xff08;关键字extends&#xff09; 四、父类成员访问 1、子类中访问父类的成员变量 &#xff08;1&#xff09;子类和父类不存在同名的成员变量 &#xff08;2&#xff09;子类和父类中存在同名的成员变量 2、子类中访…

CVPR 2024揭幕,清华大学论文接收量霸榜,轻松碾压斯坦福、麻省理工

CVPR2024 会议之眼 快讯 会议介绍 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月17日至21日正在美国西雅图召开。CVPR是计算机视觉和模式识别领域的顶级会议之一。与ICCV和ECCV并称为计算…

Vue中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…

ASM字节码插桩技术初探

一、ASM简介 ASM(全称&#xff1a;ASMifier Class Visitor)是一个java字节码操纵框架&#xff0c;ASM 提供了许多 API 和工具,可以直接以二进制形式读取和修改类文件、动态生成类或者增强既有类的功能。 1、 ASM 主要作用 asm用于生成、编辑、分析java的class…

仿真模拟--telnet服务两种认证模式(自作)

自己做的笔记,有问题或看不懂请见解一下~ 目录 两个路由器间实现telnet服务(password认证模式) server client 两个路由器间实现telnet服务(aaa认证模式) server client 改名 tab键补齐 不会就扣问号 ? save 两个路由器间实现telnet服务…

【车载开发系列】CAN通信总线再理解(中篇)

【车载开发系列】CAN通信总线再理解&#xff08;中篇&#xff09; 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1&#xff09;CAN的通信帧类型2&#xff09;CAN的标准帧格式1. CAN ID2. 数据场 3&#xff09;CAN总线仲裁 十二. CAN应用层1&#xff09;CANopen2&#xff09…

蚓链数字化营销系统,开启企业无限可能!

蚓链数字化营销系统带给企业的不仅仅是卖货方案&#xff0c;其重要的是让企业具备拥有融合资源的能力、实现在更多业态跨界赚钱的能力、及打造品牌价值的能力。 在当今数字化时代&#xff0c;蚓链数字化营销系统正为企业带来新的变革与机遇。它所赋予企业的&#xff0c;绝非仅仅…

[Vulnhub] Sleepy JDWP+Tomcat+Reverse+Reverse-enginnering

信息收集 Server IP AddressPorts Opening192.168.8.100TCP:21,8009,9001 $ nmap -sV -sC 192.168.8.100 -p- --min-rate 1000 -Pn Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-20 05:06 EDT Nmap scan report for 192.168.8.100 (192.168.8.100) Host is up (0.00…

Python学习打卡:day11

day11 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day1183、自定义 Python 包创建包导入包方式1方式2方式3方式4 84、安装第三方包安装第三方包——pippip的网络优化 安装第三方包——PyCharm 85、…

【DKN: Deep Knowledge-Aware Network for News Recommendation】

DKN: Deep Knowledge-Aware Network for News Recommendation 摘要 在线新闻推荐系统旨在解决新闻信息爆炸的问题&#xff0c;为用户进行个性化推荐。 总体而言&#xff0c;新闻语言高度凝练&#xff0c;充满知识实体和常识。 然而&#xff0c;现有的方法并没有意识到这些外部…

Cesium源码解析六(3dtiles属性获取、建筑物距离计算、建筑物着色及其原理分析)

快速导航 Cesium源码解析一&#xff08;搭建开发环境&#xff09; Cesium源码解析二&#xff08;terrain文件的加载、解析与渲染全过程梳理&#xff09; Cesium源码解析三&#xff08;metadataAvailability的含义&#xff09; Cesium源码解析四&#xff08;metadata元数据拓展…

【因果推断python】46_估计量2

目录 连续型干预变量案例 非线性处理效果 关键思想 连续型干预变量案例 目标转换方法的另一个明显缺点是它仅适用于离散或二元处理。这是你在因果推理文献中经常看到的东西。大多数研究都是针对二元干预案例进行的&#xff0c;但您找不到很多关于连续干预的研究。这让我很困…

Javase.String 类

String 类 【本节目标】1. String类的重要性2. 常用方法2.1 字符串构造2.2 String对象的比较2.3 字符串查找2.4 转化2.5 字符串替换2.7 字符串截取2.8 其他操作方法2.9 字符串的不可变性2.10 字符串修改 3. StringBuilder和StringBuffer3.2 面试题&#xff1a; 4. String类oj4.…

使用虚拟滚动条优化通过el-collapse展示多条数据的性能问题

我们将一个10000条的数据通过el-collapse展示出来&#xff0c;同时在点开每一个item时&#xff0c;要内置一个编辑器&#xff0c;对文本内容进行编辑。其实&#xff0c;如果仅10000条数据的文本的单独展示&#xff0c;可能性能不会太差&#xff0c;但由于每一条都需要带有一个文…

web中间件漏洞-jboss部署war包

web中间件漏洞-jboss部署war包 攻击机服务器准备好的ma.war

FreeBSD在zfs挂接第二块ssd 硬盘

为FreeBSD机器新增加了一块ssd硬盘&#xff1a;骑尘 256G 先格式化分区硬盘 进入bsdconfig 选Disk Management 选择ada1 &#xff0c;也就是新增加的硬盘 选择auto 然后选择Entire Disk 提示信息 The existing partition scheme on this disk (MBR) │ …