LeetCode 1164, 125, 94

目录

  • 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.mfbz.cn/a/727305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HAC-TextRank算法进行关键语句提取

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

黑马头条Minio报错non-xml response from server错误的解决方法

今天在写项目的时候&#xff0c;想测试minio上传文件功能是否正常&#xff0c; 但是每次都出现non-xml response from server的错误。 自己也在网上找了很多解决方法&#xff0c;大部分是说用户名和密码的配置问题&#xff0c;但是检查后发现并没有错误。 最后发现是自己的dock…

AGI|以ChatGPT为例,浅析AI究竟能干什么?

目录 一、前言 二、ChatGPT 三、Prompt Engineering 四、神经网络 五、后记 一、前言 当一个新事物的出现&#xff0c;最好的办法就是了解它出现的背景&#xff0c;发展的历史。 当ChatGPT出现在我们面前&#xff0c;多轮对话能力让人震惊&#xff0c;仿佛机器真的可以&qu…

计算机网络:应用层 - 万维网 HTTP协议

计算机网络&#xff1a;应用层 - 万维网 & HTTP协议 万维网 WWW统一资源定位符 URL 超文本传输协议 HTTP非持续连接持续连接非流水线流水线 代理服务器HTTP报文 万维网 WWW 万维网是一个大规模的、联机式的信息储藏所。万维网用链接的方法能非常方便地从互联网上的一个站点…

linux 安装redis 完整步骤

安装&#xff1a; 1.获取redis资源 复制代码 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 复制代码 tar xzvf redis-4.0.8.tar.gz 3.安装 复制代码 cd redis-4.0.8 make cd src make install PREFIX/usr/local/redis 4.移动配置文件到安装…

关于椭圆的方程(有Python画的动图)

关于椭圆的方程&#xff08;有Python画的动图&#xff09; flyfish 几何定义 椭圆是平面上所有到两个固定点&#xff08;焦点&#xff09;的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​&#xff…

【数据结构】红黑树实现详解

在本篇博客中&#xff0c;作者将会带领你使用C来实现一棵红黑树&#xff0c;此红黑树的实现是基于二叉搜索树和AVLTree一块来讲的&#xff0c;所以在看本篇博客之前&#xff0c;你可以先看看下面这两篇博客 【C】二叉搜索树-CSDN博客 【数据结构】AVLTree实现详解-CSDN博客 在这…

填坑-celery正常启动后能收到任务但不执行任务的解决办法

场景 Flask开发中用celery 6正常启动后能收到任务但不执行任务的解决办法&#xff0c;也没有错误提示…… INFO/MainProcess] Task app.add_together[ce406ed8-71b3-49e6-8556-f44bfe66549c] received [2024-06-20 19:38:10,632: INFO/SpawnPoolWorker-36] child process 2244…

【安防天下】模拟视频监控系统——模拟监控系统的构成视频采集设备

文章目录 1 模拟监控系统的构成2 视频采集设备2.1 摄像机相关技术2.1.1 摄像机的工作原理2.1.2 摄像机的分类2.1.3 摄像机的主要参数 2.2 镜头相关介绍2.2.1 镜头的主要分类2.2.2 镜头的主要参数 1 模拟监控系统的构成 模拟视频监控系统又称闭路电视监控系统&#xff0c; 一般…

基于SpringBoot+Vue电影推荐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

Day 28:2748. 美丽下标对的数目

Leetcode 2748. 美丽下标对的数目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length &#xff0c;如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 &#xff0c;则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回…

探索FlowUs息流:个人和团队知识管理解决方案|FlowUs稳定保障你的笔记安全无忧

FlowUs息流&#xff1a;稳定运营保障你的笔记安全无忧 在知识管理工具的选择上&#xff0c;稳定性是用户最关心的问题之一。FlowUs息流以其稳定的运营记录&#xff0c;为用户提供了一个可靠的工作环境。我们深知&#xff0c;一个知识管理平台的稳定性直接影响到团队的生产力和…

ACS自助借还服务端模拟工具(3M SIP2协议)

点击下载《ACS自助借还服务端模拟工具&#xff08;源代码&#xff09;》 1. 前言 在当今科技迅猛发展的时代&#xff0c;自助服务系统已成为提升用户体验和运营效率的关键。为了满足自助借还软件辅助开发的需求&#xff0c;我们精心打造了一款功能强大的ACS服务端模拟软件。这…

Ranger配置图片及json文件预览

文章目录 前言下载apt下载pip下载 配置使用json文件预览方法一 修改scope用cat预览方法二 安装jq预览配置ranger 图片文件预览方法一 使用img2txt预览方法二 使用fim预览配置ranger 总结 前言 本文主要讲解Ranger12如何配置json及图片的预览设置&#xff0c;如下是ranger的介绍…

UniApp 开发微信小程序教程(二):下载安装微信开发者工具

文章目录 一、微信开发者工具简介二、下载安装微信开发者工具1. 下载微信开发者工具步骤&#xff1a; 2. 安装微信开发者工具Windows 系统&#xff1a;Mac 系统&#xff1a; 3. 配置微信开发者工具登录微信开发者工具&#xff1a;新建项目&#xff1a; 4. 预览和调试预览&#…

基于一种改进熵方法的旋转机械故障诊断模型(MATLAB)

熵的概念起源于热力学&#xff0c;1884年&#xff0c;玻尔兹曼定义熵&#xff0c;用以描述分子热运动的无序性和混乱度。1948年&#xff0c;Shannon在其发表的《AMathematicalTheoryofCommunication》中提出香农熵&#xff0c;首次将“熵”引入信息度量范畴&#xff0c;为信息论…

眼见不一定为实之MySQL中的不可见字符

目录 前言 一、问题的由来 1、需求背景 2、数据表结构 二、定位问题 1、初步的问题 2、编码是否有问题 3、依然回到字符本身 三、深入字符本身 1、回归本质 2、数据库解决之道 3、代码层解决 四、总结 前言 在开始今天的博客内容之前&#xff0c;正在看博客的您先来…

ENVI实战—一文搞定非监督分类

实验1&#xff1a;使用isodata法分类 目的&#xff1a;学会使用isodata法开展非监督分类 过程&#xff1a; ①导入影像&#xff1a;打开ENVI&#xff0c;按照“文件→打开为→光学传感器→ESA→Sentinel-2”的顺序&#xff0c;打开实验1下载的哨兵2号数据。 图1 ②区域裁剪…

【Oracle篇】Oracle数据库坏块处理:rman修复坏块实践与案例分析(第七篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

分层Agent

分层Teams 分层Agent创建tool研究团队工具文档编写团队工具 通用能力定义Agent团队研究团队文档编写团队 添加图层 分层Agent 在前面的示例&#xff08;Agent管理&#xff09;中&#xff0c;我们引入了单个管理节点的概念&#xff0c;用于在不同工作节点之间路由工作。 但是&a…