Rust每日一练(Leetday0007) 删除结点、有效括号、合并链表

news2024/11/24 1:34:47

目录

19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list  🌟🌟

20. 有效的括号 Valid Parentheses  🌟

21. 合并两个有序链表 Mmerge-two-sorted-lists  🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶:你能尝试使用一趟扫描实现吗?

代码:

pub struct ListNode {
    pub data: i32,
    pub next: Option<Box<ListNode>>,
}

impl ListNode {
    pub fn new(val: i32) -> Self {
        ListNode {
            next: None,
            data: val,
        }
    }

    pub fn build(&mut self, list: Vec<i32>) {
        // 倒序建立链表
        for i in (0..list.len()).rev() {
            let node = ListNode {
                data: list[i],
                next: self.next.take(),
            };
            self.next = Some(Box::new(node));
        }
    }

    pub fn travel(&self) {
        let mut p = self.next.as_ref();
        while let Some(node) = p {
            print!("{}{}", node.data, if node.next.is_some() { "->" } else { "" });
            p = node.next.as_ref();
        }
        println!("<nil>");
    }
}

fn remove_nth_from_end(head: Option<Box<ListNode>>, n: i32) -> Option<Box<ListNode>> {
    let mut head = head;
    let mut count = 0;
    // 遍历链表并计数
    let mut p = head.as_ref();
    while let Some(node) = p {
        count += 1;
        p = node.next.as_ref();
    }
    // 计算要删除的节点的索引
    let m = count - n;
    if m == 0 { // 如果删除的是头节点,则直接返回第二个节点
        return head.unwrap().next;
    }
    // 遍历链表并删除节点,注意需要显式修改前一个节点的指针
    let mut p = head.as_mut();
    for _ in 1..m {
        p = p.unwrap().next.as_mut();
    }
    let node_to_be_deleted = p.as_mut().unwrap().next.take().unwrap();
    p.as_mut().unwrap().next = node_to_be_deleted.next;
    head
}

fn main() {
    let mut head = Box::new(ListNode { data: 0, next: None });
    head.build(vec![1, 2, 3, 4, 5]);
    head.travel();
    head = remove_nth_from_end(Some(head), 2).unwrap();
    head.travel();

    head = Box::new(ListNode { data: 0, next: None });
    head.build(vec![1]);
    head.travel();
    head = remove_nth_from_end(Some(head), 1).unwrap();
    head.travel();

    head = Box::new(ListNode { data: 0, next: None });
    head.build(vec![1, 2]);
    head.travel();
    head = remove_nth_from_end(Some(head), 1).unwrap();
    head.travel();
}

输出:

1->2->3->4->5<nil>
1->2->3->5<nil>
1<nil>
<nil>
1->2<nil>
1<nil>


20. 有效的括号 Valid Parentheses

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成

代码:

fn is_valid(s: String) -> bool {
    let mut stack = Vec::<u8>::new();
    for ch in s.chars() {
        match ch {
            '(' => stack.push(b'('),
            '[' => stack.push(b'['),
            '{' => stack.push(b'{'),
            ')' => {
                if let Some(c) = stack.pop() {
                    if c != b'(' {
                        return false;
                    }
                } else {
                    return false;
                }
            }
            ']' => {
                if let Some(c) = stack.pop() {
                    if c != b'[' {
                        return false;
                    }
                } else {
                    return false;
                }
            }
            '}' => {
                if let Some(c) = stack.pop() {
                    if c != b'{' {
                        return false;
                    }
                } else {
                    return false;
                }
            }
            _ => {}
        }
    }
    stack.is_empty()
}

fn main() {
    println!("{}", is_valid("()".to_string()));
    println!("{}", is_valid("()[]{}".to_string()));
    println!("{}", is_valid("(]".to_string()));
    println!("{}", is_valid("([)]".to_string()));
    println!("{}", is_valid("{()}".to_string()));
}

输出:

true
true
false
false
true


21. 合并两个有序链表 Mmerge-two-sorted-lists

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

代码:

pub struct ListNode {
    pub data: i32,
    pub next: Option<Box<ListNode>>,
}

impl ListNode {
    pub fn new(val: i32) -> Self {
        ListNode {
            next: None,
            data: val,
        }
    }

    pub fn build(&mut self, list: Vec<i32>) {
        for i in (0..list.len()).rev() {
            let p = ListNode {
                data: list[i],
                next: self.next.take(),
            };
            self.next = Some(Box::new(p));
        }
    }

    pub fn travel(&self) {
        let mut p = self.next.as_ref();
        while let Some(node) = p {
            print!("{}{}", node.data, if node.next.is_some() { "->" } else { "" });
            p = node.next.as_ref();
        }
        println!("<nil>");
    }
}

fn merge_two_lists(mut l1: Option<Box<ListNode>>, mut l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut res = Box::new(ListNode::new(-1)); 
    let mut p = &mut res;
    while l1.is_some() && l2.is_some() {
        let val;
        if l1.as_ref().unwrap().data < l2.as_ref().unwrap().data {
            val = l1.as_ref().unwrap().data;
            l1 = l1.unwrap().next;
        } else {
            val = l2.as_ref().unwrap().data;
            l2 = l2.unwrap().next;
        }
        p.next = Some(Box::new(ListNode::new(val)));
        p = p.next.as_mut().unwrap();
    }
    if l1.is_some() {
        p.next = l1;
    } else if l2.is_some() {
        p.next = l2;
    }
    res.next
}

fn main() {
    let mut l1 = Box::new(ListNode::new(0));
    let mut l2 = Box::new(ListNode::new(0));
    l1.build(vec![1, 2, 4]);
    l2.build(vec![1, 3, 4]);
    l1.travel();
    l2.travel();

    let result = merge_two_lists(l1.next, l2.next).unwrap();
    result.travel();
}

输出:

1->2->4<nil>
1->3->4<nil>
1->2->3->4->4<nil>?有待改正


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

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

相关文章

web搭建服务器端+创建web后端项目详细步骤

一、搭建服务器端 Web服务器&#xff1a;用于响应来自Web客户端&#xff08;如浏览器、移动应用程序等&#xff09;的请求并提供Web页面和其他Web资源的软件程序或计算机系统。它允许用户在Web浏览器中输入网址&#xff0c;通过HTTP协议向服务器发送请求&#xff0c;并收到Web页…

用原生JS实现虚拟列表(IT枫斗者)

用原生JS实现虚拟列表 介绍 最近在开发需求的时候&#xff0c;有用到 Antd 的虚拟列表组件 rc-virtual-list &#xff0c;粗略地看了一下源码&#xff0c;于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的&#xff0c;而且在列表滚动的过程…

Golang每日一练(leetDay0073) 实现前缀树、最短子数组

目录 208. 实现 Trie (前缀树) Implement-trie-prefix-tree &#x1f31f;&#x1f31f; 209. 长度最小的子数组 Minimum-size-subarray-sum &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每…

多线程的三种创建方式及各自的优缺点分析

第一种方式&#xff1a;继承Thread类&#xff0c;覆写run()方法 1、创建一个MyThread类&#xff0c;继承Thread类&#xff1b; 2、覆写run()方法&#xff0c;在run()方法内编写任务代码&#xff1b; 3、创建MyThread类&#xff0c;需要注意的是&#xff0c;如果想要给线程命名…

传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model)

文章目录 效果一览基本描述模型介绍程序设计参考资料效果一览 基本描述 传染病学模型 | Matlab实现SI传染病学模型 (SI Epidemic Model) 模型介绍 SI传染病模型是一种基于微分方程的流行病学模型,用于模拟传染病在人群中的传播过程。SI模型中,人群被划分为易感者(S)和感染者…

来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

大家好&#xff0c;我是学生大使 Jambo。在我们前一篇文章中&#xff0c;我们介绍了 OpenAI 模型的调用。今天&#xff0c;我将为大家介绍 Embedding 的使用。 嵌入是什么 嵌入&#xff08;Embedding &#xff09;是一种将高维数据映射到低维空间的方法。嵌入可以将高维数据可…

第一章 初识Python

1.1 课前必读 课程大纲 1.2 Python介绍 Python特点&#xff1a; 主流语言&#xff1b;用途广泛&#xff0c;号称万能语言&#xff1b;上手简单&#xff1b; Python用途&#xff1a; 数据挖掘&#xff08;爬虫&#xff09;和数据分析自动化脚本编写&#xff08;软件测试人员使用…

尚硅谷周阳老师 SpringCloud第二季学习笔记

前言&#xff1a;首先感谢尚硅谷周阳老师的讲解&#xff0c;让我对springcloud有了很好的理解&#xff0c;周阳老师的讲课风格真的很喜欢&#xff0c;内容充实也很幽默&#xff0c;随口一说就是一个段子&#xff0c;我也算是周阳老师的忠实粉丝啦。 先说说课程总体内容 以下是…

[学习笔记] [机器学习] 6. [上]决策树算法(熵Entropy、信息增益(率)、基尼值(指数)、CART剪枝、特征工程特征提取、回归决策树)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 掌握决策树实现过程知道信息熵的公式以及作用知道信息增益、信息增益率和基尼指数的作用知道id3、c4.5、cart算法的区别了解cart剪枝的作用知道特征提取的作用应用DecisionTreeClassifier实现决策树分类 1…

开放原子训练营(第三季)inBuilder低代码开发实验室,低代码到底该长什么样

目录 前言&#xff1a; 一、什么是inBuilder低代码开发实验室 二、技术特征 2.1开放性 2.2开发语言无关性 2.3云原生 2.4模型工程化 2.5全栈模型刻画 2.6运行态定制 2.7仓库介绍 三、快速入门 四、实操案例 4.1定义数据源 4.2 设计页面 4.3发布调试 五、总结 前言&#xf…

Activiti实战——Springboot整合Activiti

目录 一、Activiti数据库表名说明 二、Spring boot整合activiti 1. 创建springboot项目 2. 引入activiti依赖及项目依赖 3. 配置数据源 &#xff08;1&#xff09;创建数据源配置文件 &#xff08;2&#xff09;配置文件 4. 配置Acitviti引擎 5. 启动项目 三、Activiti…

【MySQL 数据库】1、MySQL 的 DDL、DML、DQL 语句

目录 一、MySQL 应该掌握哪些知识点 &#xff1f;二、数据库相关概念三、主流关系型数据库管理系统四、关系型数据库五、SQL 语句的分类六、DDL(1) 数据库操作(2) 表操作(3) 字段的数据类型(4) 创建员工表(5) 修改表结构(6) 删除某一张表 七、DML八、DQL(1) 员工表(2) distinct…

经典神经网络(4)Nin-Net及其在Fashion-MNIST数据集上的应用

经典神经网络(4)Nin-Net及其在Fashion-MNIST数据集上的应用 1 Nin-Net的简述 1.1 Nin-Net的概述 LeNet、AlexNet和VGG都有⼀个共同的设计模式&#xff1a;通过⼀系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进⾏处理。AlexNet和VGG对Le…

线程池的创建与使用

void execute(Runnable run)方法处理Runnbale任务 Future<> submit(Callable<> task)方法处理Callable任务 void shutdown()结束线程池 List<\Runnable> shutdownNow()立即结束线程池&#xff0c;不管任务是否执行完毕 //创建线程池的一种方式 ExecutorServi…

基于WebApi实现ModbusTCP数据服务

在上位机开发过程中&#xff0c;有时候会遇到需要提供数据接口给MES或者其他系统&#xff0c;今天跟大家分享一下&#xff0c;如何在Winform等桌面应用程序中&#xff0c;开发WebApi接口&#xff0c;提供对外数据服务。 为了更好地演示应用场景&#xff0c;本案例以读取Modbus…

Leetcode 209. 长度最小的子数组——go语言实现

文章目录 一、题目描述二、代码实现方法一&#xff1a;暴力法解题思路代码实现复杂度分析 方法二&#xff1a;滑动窗口 双指针解题思路代码实现复杂度分析 方法三&#xff1a;前缀和 二分查找解题思路代码实现复杂度分析 一、题目描述 给定一个含有 n 个正整数的数组和一个正…

STM32 10个工程篇:1.IAP远程升级(四)

在前三篇博客中主要介绍了IAP远程升级的应用背景、下位机的实现原理、以及基于STM32CubeMX对STM32F103串口DMA的基本配置&#xff0c;第四篇博客主要想介绍Labview端上位机和下位机端的报文定义和通信等。 当笔者工作上刚接触到STM32 IAP升级的时候&#xff0c;实事求是地说存在…

【科普】电压和接地真的存在吗?如何测试?

经常在实验室干活的&#xff0c;难免不被电击过&#xff0c;尤其是在干燥的北方&#xff0c;“被电”是常有的事情&#xff0c;我记得有一次拿着射频线往仪表上拧的时候&#xff0c;遇到过一次严重的电火花&#xff0c;瞬间将仪表的射频口边缘烧出了一个疤&#xff0c;实验室遭…

LeetCode83. 删除排序链表中的重复元素

写在前面&#xff1a; 题目链接&#xff1a;LeetCode83. 删除排序链表中的重复元素 编程语言&#xff1a;C 题目难度&#xff1a;简单 一、题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 …

Java中异常的处理及捕获

Java中异常的处理及捕获 一、异常的概述 &#xff08;1&#xff09;Java中异常的作用&#xff1a;增强程序的健壮性 &#xff08;2&#xff09;在Java中所有的Error&#xff08;错误&#xff09;和异常&#xff08;Exception&#xff09;都继承了同一个父类Throwable 二、异…