CSDN每日一题学习训练——Python版(简化路径,不同的二叉搜索树)

news2024/12/24 0:06:28

版本说明

当前版本号[20231116]。

版本修改说明
20231116初版

目录

文章目录

  • 版本说明
  • 目录
  • 简化路径
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码
  • 不同的二叉搜索树
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码

简化路径

题目

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。

返回简化后得到的 规范路径 。

示例 1:

输入:path = “/home/”
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。

示例 2:

输入:path = “/…/”
输出:“/”
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

示例 3:

输入:path = “/home//foo/”
输出:“/home/foo”
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

输入:path = “/a/./b/…/…/c/”
输出:“/c”

提示:

1 <= path.length <= 3000
path 由英文字母,数字,‘.’,‘/’ 或 ‘_’ 组成。
path 是一个有效的 Unix 风格绝对路径。

解题思路

解题思路:

  1. 创建一个空列表 result,用于存储简化后的路径。
  2. 将输入的路径字符串 path 按照斜杠 ‘/’ 进行分割,得到一个列表 plist。
  3. 遍历 plist 中的每个元素 pos。
    • 如果 pos 不为空,则进行以下判断:
      • 如果 pos 等于 ‘…’,表示需要返回上一级目录。尝试从 result 中弹出最后一个元素(即返回上一级目录)。如果 result 为空,则将其重置为空列表。
      • 如果 pos 不等于 ‘.’,表示当前目录或文件名有效。将其添加到 result 列表中。
  4. 使用 join() 方法将 result 列表中的元素用斜杠 ‘/’ 连接起来,并在前面加上一个斜杠作为根目录。
  5. 返回简化后的规范路径。

代码思路

  1. 先定义了一个名为Solution的类,并在其中实现了一个名为simplifyPath的方法。该方法接受一个字符串类型的参数path,表示要简化的文件路径。

     def simplifyPath(self, path):
    
  2. 在方法内部,首先定义了一个空列表result,用于存储简化后的路径。然后,使用split('/')方法将输入的路径按照斜杠分割成一个列表plist,其中每个元素表示路径中的一个目录或文件名。

         result = []  # 初始化结果列表
            plist = path.split('/')  # 将路径按照斜杠分割成列表
    
  3. 接下来,使用一个循环遍历plist中的每个元素。如果当前元素不为空,则进行以下判断:

    • 如果当前元素为..,表示需要返回上一级目录。此时,尝试从result中弹出最后一个元素(即返回上一级目录)。如果result为空,则将其重置为空列表。

      for pos in plist:  # 遍历列表中的每个元素
                  if pos:  # 如果元素不为空
                      if pos == '..':  # 如果元素为'..',表示返回上一级目录
                          try:
                              result.pop()  # 弹出结果列表中最后一个元素
                          except:
                              result = []  # 如果结果列表为空,则将其重置为空列表
      
    • 如果当前元素不为.,表示当前目录或文件名有效。将其添加到result列表中。

         elif pos != '.':  # 如果元素不为'.',表示当前目录
                          result.append(pos)  # 将当前目录添加到结果列表中
      
  4. 最后,使用join()方法将result列表中的元素用斜杠连接起来,并在前面加上一个斜杠作为根目录。最终返回简化后的路径。

      return '/' + '/'.join(result)  # 将结果列表中的元素用斜杠连接起来,并在前面加上一个斜杠作为根目录
    
  5. 在代码的最后,创建了一个Solution类的实例s,并调用其simplifyPath方法,传入一个示例路径/home/,并将结果打印输出。

s = Solution()  # 创建Solution类的实例
print(s.simplifyPath(path="/home/"))  # 调用simplifyPath方法,传入路径参数,并打印结果

参考代码

这段代码主要是使用栈来处理路径中的目录和文件名。

class Solution(object):
    def simplifyPath(self, path):
        """
        :type path: str
        :rtype: str
        """
        result = []
        plist = path.split('/')
        for pos in plist:
            if pos:
                if pos == '..':
                    try:
                        result.pop()
                    except:
                        result = []
                elif pos != '.':
                    result.append(pos)
        return '/'+'/'.join(result)
# %%
s = Solution()
print(s.simplifyPath(path = "/home/"))

不同的二叉搜索树

题目

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

image-20231116232715671

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

1 <= n <= 19

解题思路

  1. 这个问题可以使用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示由i个节点组成的二叉搜索树的种数。根据题目要求,我们可以得到以下状态转移方程:

    dp[i] = Σ(dp[j-1] * dp[i-j]) (j=1,2,...,i)
    
  2. 这个方程的含义是,对于每个节点i,它有左子树和右子树,左子树的节点数为j-1,右子树的节点数为i-j。因此,我们需要遍历所有可能的j值,计算出对应的二叉搜索树的种数,并将它们累加起来。

代码思路

  1. 初始化一个长度为n+1的动态规划数组dp,初始值为0。

     # 初始化动态规划数组,长度为n+1,初始值为0
            dp = [0] * (n + 1)
    
  2. 当节点数为0时,只有一种可能,即空树,所以将dp[0]设为1。

  3. 当节点数为1时,只有一种可能,即只有一个节点的树,所以将dp[1]设为1。

      # 当节点数为0时,只有一种可能,即空树
            dp[0] = 1
            # 当节点数为1时,只有一种可能,即只有一个节点的树
            dp[1] = 1
    
  4. 从第2个节点开始遍历到第n个节点,对于每个节点level,遍历所有可能的根节点root。

    # 从第2个节点开始遍历到第n个节点
            for level in range(2, n + 1):
                # 对于每个节点,遍历所有可能的根节点
                for root in range(1, level + 1):
    
  5. 根据组合数公式,计算当前节点数下,以root为根节点的二叉搜索树的数量。具体计算公式为:dp[level] += dp[level - root] * dp[root - 1]。

      # 根据组合数公式,计算当前节点数下,以root为根节点的二叉搜索树的数量
                    dp[level] += dp[level - root] * dp[root - 1]
    
  6. 返回给定节点数下的二叉搜索树数量,即dp[n]。

      # 返回给定节点数下的二叉搜索树数量
            return dp[n]
    
  7. 创建Solution对象s,并调用numTrees方法,传入节点数n=3,计算节点数为3的二叉搜索树数量,并打印结果。

# 创建Solution对象
s = Solution()
# 调用numTrees方法,计算节点数为3的二叉搜索树数量,并打印结果
print(s.numTrees(n = 3))

参考代码

这段代码是一个计算给定节点数的二叉搜索树数量的函数。它使用了动态规划的方法,通过遍历每个节点和所有可能的根节点,计算出以当前节点为根节点的二叉搜索树的数量。最后返回给定节点数下的二叉搜索树数量。

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [0] * (n + 1)
        dp[0] = 1
        dp[1] = 1
        for level in range(2, n + 1):
            for root in range(1, level + 1):
                dp[level] += dp[level - root] * dp[root - 1]
        return dp[n]
# %%
s = Solution()
print(s.numTrees(n = 3))

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

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

相关文章

YOLOv8改进 | ICLR 2022 |ODConv附修改后的C2f、Bottleneck模块代码

论文地址&#xff1a;论文地址点击即可跳转阅读 代码地址&#xff1a;文末提供复制粘贴的代码块 一、本文介绍 这篇文章给大家带来的是发表于2022年ICLR的ODConv(Omni-Dimensional Dynamic Convolution)中文名字全维度动态卷积&#xff0c;该卷积可以即插即用&#xff0c;可…

【flink理论】动态表:关系查询处理流的思路:连续查询、状态维护;表转换为流需要编码编码

文章目录 一. 使用关系查询处理流的讨论二. 动态表 & 连续查询(Continuous Query)三. 在流上定义表1. 连续查询2. 查询限制2.1. 维护状态2.2. 计算更新 四. 表到流的转换1. Append-only 流2. Retract 流3. Upsert 流 本文主要讨论了&#xff1a; 讨论通过关系查询处理无界流…

MySQL 1、初识数据库

一、什么是数据库&#xff1f; 以特定的格式保存好的文件&#xff0c;我们就叫做数据库。 提供较为便捷的数据的存取服务的软件集合、解决方案&#xff0c;我们就叫它数据库。 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库。 文件或数据库都可以存储数据&#…

基于单片机设计的水平仪(STC589C52+MPU6050)

一、前言 【1】项目背景 水平仪是一种常见的测量工具&#xff0c;用于检测物体或设备的水平姿态。在许多应用中&#xff0c;如建筑、制造和航空等领域&#xff0c;保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示&#xff0c;基于单片机设计的水平仪是一个常见…

LeetCode(26)判断子序列【双指针】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 判断子序列 1.题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;…

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

通讯录实现之进阶版将通讯录数据保存在文件中(完整代码)

我们在之前的博客中已经写过两版通讯录了&#xff1a; 第一版是用C语言实现了通讯录&#xff0c;但是通讯录的存储人数信息是固定的&#xff0c;用完就没有了 感兴趣的可以转到对应博客看一下&#xff0c;附带链接&#xff1a;第一版通讯录 第二版是在第一版的基础上动态开辟…

vscode Prettier配置

常用配置项&#xff1a; .prettierrc.json 是 Prettier 格式化工具的配置文件 {"printWidth": 200, // 指定行的最大长度"tabWidth": 2, // 指定缩进的空格数"useTabs": false, // 是否使用制表符进行缩进&#xff0c;默认为 false"singl…

GPTS全网刷屏!定制增长速度指数增长

还记的上周OpenAI刚刚举行完开发者大会&#xff0c;在大会上主要公布了三个事情&#xff1a; 新版本的GPT-4 Turbo&#xff1a;更强大、更便宜且支持128K新的助手API&#xff1a;让开发者更轻松地基于GPT构建辅助AI应用平台中新的多模态功能&#xff1a;包括视觉、图像创作&am…

SpringMVC调用流程

SpringMVC的调用流程 SpringMVC涉及组件理解&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ] HandlerMapping : SpringMVC提供&…

如何理解Java是按值传递

在 Java 中&#xff0c;参数传递有两种方式&#xff1a;按值传递&#xff08;pass by value&#xff09;和按引用传递&#xff08;pass by reference&#xff09;。然而&#xff0c;Java 中的参数传递方式实际上是按值传递的。 按值传递的含义是&#xff1a; 在方法调用时&am…

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日&#xff0c;日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解&#xff0c;揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示&#xff0c;该手机的国产零部件比例达到了47%&#xff0c;相较于三年前的 Mate 40 Pro&#xff0c;提高…

2.FastRunner定时任务Celery+RabbitMQ

注意&#xff1a;celery版本和Python冲突问题 不能用高版本Python 用3.5以下&#xff0c;因为项目的celery用的django-celery 3.2.2 python3.7 async关键字 冲突版本 celery3.x方案一&#xff1a; celery3.xpython3.6方案二 &#xff1a; celery4.xpython3.7 解决celery执…

Accelerate 0.24.0文档 三:超大模型推理(内存估算、Sharded checkpoints、bitsandbytes量化、分布式推理)

文章目录 一、内存估算1.1 Gradio Demos1.2 The Command 二、使用Accelerate加载超大模型2.1 模型加载的常规流程2.2 加载空模型2.3 分片检查点&#xff08;Sharded checkpoints&#xff09;2.4 示例&#xff1a;使用Accelerate推理GPT2-1.5B2.5 device_map 三、bitsandbytes量…

计算机毕业设计选题推荐-幼儿园管理微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

微机原理_10

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1,将二进制数110110.01转换为十六进制为(&#xff09; A. 66.1H B. 36.4H C. 66.4 D. 36.2 2,一台计算机的字长是4个字节,含义是(&#xff09; A.能处理的最大…

soh估计:Data-driven prediction of battery cycle life before capacity degradation

文献思想 作者发现不同循环寿命的电池&#xff0c;第100次和第10次循环放电容量的差有不同&#xff0c;作者由这一现象&#xff0c;提取出了放电容量差的方差、平均值、最小值等特征&#xff0c;其中放电容量差的方差对数和循环寿命的对数的皮尔逊相关性高达-0.93&#xff0c;…

【精选】JavaScript语法大合集【附代码和超详细介绍以及使用】

JavaScript语法大合集 JavaScript引入到文件 嵌入到HTML文件中 <body><script>var num10;console.log(num);</script> </body>引入本地独立JS文件 <body><script src"./hello.js"></script> </body>引入网络来源…

leetcode:链表的中间结点

1.题目描述 题目链接&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 我们先看题目描述&#xff1a; 2.解题思路 我们用画图用快慢指针来解决这个问题 定义一个快指针fast&#xff0c;一个慢指针slow 快指针一次走两个结点&#xff0c;慢指针一次…

3GPP协议解读(一)_23.501_23.502_PDU Session_SMF与UDP的交互

UE发起计算服务申请后&#xff0c;网络侧处理的流程 UE发起服务的流程&#xff1a;service request网络侧处理服务涉及的通信数据通过PDU Session进行传输&#xff0c;涉及到SMF与UPF的交互。PDU Session的建立、管理全部由SMF&#xff08;Session Management Function&#x…