Rust每日一练(Leetday0022) 最小路径和、有效数字、加一

news2024/12/26 21:15:32

目录

64. 最小路径和 Minimum Path Sum  🌟🌟

65. 有效数字 Valid Number  🌟🌟🌟

66. 加一 Plus One  🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


64. 最小路径和 Minimum Path Sum

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

代码1:动态规划

fn min_path_sum(grid: Vec<Vec<i32>>) -> i32 {
    let m = grid.len();
    let n = grid[0].len();
    let mut dp = vec![vec![0; n]; m];
    dp[0][0] = grid[0][0];
    for i in 1..m {
        dp[i][0] = dp[i-1][0] + grid[i][0];
    }
    for j in 1..n {
        dp[0][j] = dp[0][j-1] + grid[0][j];
    }
    for i in 1..m {
        for j in 1..n {
            dp[i][j] = std::cmp::min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
        }
    }
    dp[m-1][n-1]
}

fn main() {
    let grid1 = vec![vec![1, 3, 1], vec![1, 5, 1], vec![4, 2, 1]];
    println!("{}", min_path_sum(grid1)); 

    let grid2 = vec![vec![1, 2, 3], vec![4, 5, 6]];
    println!("{}", min_path_sum(grid2)); 
}

输出:

7
12

代码2:DFS

fn min_path_sum(grid: Vec<Vec<i32>>) -> i32 {
    let m = grid.len();
    let n = grid[0].len();
    dfs(&grid, m-1, n-1)
}

fn dfs(grid: &Vec<Vec<i32>>, i: usize, j: usize) -> i32 {
    if i == 0 && j == 0 {
        return grid[0][0];
    }
    let mut res = i32::max_value();
    let mut left = i32::max_value();
    if i > 0 {
        res = dfs(grid, i-1, j);
    }
    if j > 0 {
        left = dfs(grid, i, j-1);
    }
    if res > left {
        res = left;
    }
    res + grid[i][j]
}

fn main() {
    let grid1 = vec![vec![1, 3, 1], vec![1, 5, 1], vec![4, 2, 1]];
    println!("{}", min_path_sum(grid1)); 

    let grid2 = vec![vec![1, 2, 3], vec![4, 5, 6]];
    println!("{}", min_path_sum(grid2)); 
}

 写成嵌套函数:

fn min_path_sum(grid: Vec<Vec<i32>>) -> i32 {
    fn dfs(grid: &Vec<Vec<i32>>, i: usize, j: usize) -> i32 {
        if i == 0 && j == 0 {
            return grid[0][0];
        }
        let mut res = i32::max_value();
        let mut left = i32::max_value();
        if i > 0 {
            res = dfs(grid, i-1, j);
        }
        if j > 0 {
            left = dfs(grid, i, j-1);
        }
        if res > left {
            res = left;
        }
        res + grid[i][j]
    }
    dfs(&grid, grid.len()-1, grid[0].len()-1)
}

fn main() {
    let grid1 = vec![vec![1, 3, 1], vec![1, 5, 1], vec![4, 2, 1]];
    println!("{}", min_path_sum(grid1)); 

    let grid2 = vec![vec![1, 2, 3], vec![4, 5, 6]];
    println!("{}", min_path_sum(grid2)); 
}

65. 有效数字 Valid Number

有效数字(按顺序)可以分成以下几个部分:

  1. 一个 小数 或者 整数
  2. (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

示例 1:

输入:s = "0"
输出:true

示例 2:

输入:s = "e"
输出:false

示例 3:

输入:s = "."
输出:false

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.' 。

代码:

fn is_number(s: String) -> bool {
    let s = s.trim();
    if s.is_empty() {
        return false;
    }
    let mut has_num = false;
    let mut has_dot = false;
    let mut has_e = false;
    for (i, ch) in s.chars().enumerate() {
        match ch {
            '0'..='9' => {
                has_num = true;
            }
            '.' => {
                if has_dot || has_e || i == s.len()-1 || (i == 0 && s.len() == 1) {
                    return false;
                }
                has_dot = true;
            }
            'e' | 'E' => {
                if has_e || !has_num || i == s.len()-1 || i == 0 {
                    return false;
                }
                has_e = true;
                has_num = false;
            }
            '+' | '-' => {
                if i != 0 && (s.chars().nth(i-1) != Some('e') && s.chars().nth(i-1) != Some('E')) {
                    return false;
                }
            }
            _ => {
                return false;
            }
        }
    }
    has_num
}

fn main() {
    println!("{}", is_number("0".to_string())); // output: true
    println!("{}", is_number(" 0.1 ".to_string())); // output: true
    println!("{}", is_number("abc".to_string())); // output: false
    println!("{}", is_number("1 a".to_string())); // output: false
    println!("{}", is_number("2e10".to_string())); // output: true
    println!("{}", is_number(" -90e3   ".to_string())); // output: true
    println!("{}", is_number(" 1e".to_string())); // output: false
    println!("{}", is_number("e3".to_string())); // output: false
    println!("{}", is_number(" 6e-1".to_string())); // output: true
    println!("{}", is_number(" 99e2.5 ".to_string())); // output: false
    println!("{}", is_number("53.5e93".to_string())); // output: true
    println!("{}", is_number(" --6 ".to_string())); // output: false
    println!("{}", is_number("-+3".to_string())); // output: false
    println!("{}", is_number("95a54e53".to_string())); // output: false
}

输出:

true
true
false
false
true
true
false
false
true
false
true
false
false
false


66. 加一 Plus One

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

代码:

fn plus_one(digits: &mut Vec<i32>) -> Vec<i32> {
    let n = digits.len();
    for i in (0..n).rev() {
        if digits[i] < 9 {
            digits[i] += 1;
            return digits.to_vec();
        }
        digits[i] = 0;
    }
    let mut res = vec![0; n+1];
    res[0] = 1;
    res
}

fn plus_one2(digits: &mut Vec<i32>) -> Vec<i32> {
    let n = digits.len();
    for i in (0..n).rev() {
        if digits[i] < 9 {
            digits[i] += 1;
            for j in i+1..n {
                digits[j] = 0;
            }
            return digits.to_vec();
        }
    }
    let mut res = vec![0; n+1];
    res[0] = 1;
    res
}

fn plus_one3(digits: &mut Vec<i32>) -> Vec<i32> {
    let mut carry = 0;
    let n = digits.len();
    digits[n-1] += 1;
    for i in (0..n).rev() {
        digits[i] += carry;
        carry = digits[i] / 10;
        digits[i] %= 10;
    }
    if carry > 0 {
        digits.insert(0, 1);
    }
    digits.to_vec()
}

fn main() {
    let mut digits = vec![4, 3, 2, 1];
    println!("{:?}", plus_one(&mut digits));
    let mut digits = vec![4, 3, 2, 1];
    println!("{:?}", plus_one2(&mut digits));
    let mut digits = vec![4, 3, 2, 1];
    println!("{:?}", plus_one3(&mut digits));
}

输出:

[4, 3, 2, 2]
[4, 3, 2, 2]
[4, 3, 2, 2]


🌟 每日一练刷题专栏 🌟

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

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

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

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

 主页: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/614017.html

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

相关文章

docker水位如何清理(容器水位清理详细分析)

docker水位过高&#xff0c;清理怕出问题&#xff1f;&#xff0c;不知道清理什么&#xff1f;怕删错了&#xff1f;进入实践 第一步准备测试数据 创建 悬空的镜像&#xff08;即REPOSITORY和TAG均为的镜像&#xff09; docker pull busybox:musl docker tag busybox:musl b…

chatgpt赋能python:Python的更新:为什么你需要及时更新并如何更新

Python的更新&#xff1a;为什么你需要及时更新并如何更新 Python是一种强大的程序设计语言&#xff0c;它具有广泛的应用&#xff0c;从数据科学&#xff0c;机器学习到Web开发&#xff0c;都有着广泛的应用。不断更新的Python版本为开发者和用户提供了最新的功能和最佳实践。…

chatgpt赋能python:Python如何在同一行输出

Python如何在同一行输出 Python是一种高级编程语言&#xff0c;广泛应用于数据科学、Web开发、人工智能等领域。其中&#xff0c;输出内容是程序必不可少的一部分。本文将介绍在Python中如何在同一行输出多个内容。 一般输出 在Python中&#xff0c;使用print函数可以将内容…

Lecture 9 Lexical Semantics

目录 Introduction: sentiment analysis 引言&#xff1a;情感分析Word Semantics 单词语义Word meanings 单词含义WordNetSynsets 同义词集Noun Relations in WordNetHypernymy Chain 上位链Word SimilarityWord Similarity with PathsBeyond Path LengthAbstract NodesConcep…

GO 性能分析

GO 性能分析 简介 ​ go提供了内存分析工具&#xff0c;pprof利用它可以看cpu和内存的情况。 包含下面的几种类型&#xff1a; cpu内存阻塞锁 pprof分为大体分为两个部分 数据采集数据分析 数据采集有两种方式&#xff1a; 官方 官方提供了两种方式 runtime/pprof 这是用…

【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动

1、关闭快速启动 NVIDIA驱动安装很是矫情,为了谨慎起见,还是禁用快速启动吧 在Win11下,进入控制面板–》硬件和声音–》电源选项–》更改电源按钮的功能 禁止“启用快速启动” 2、关闭设备加密 关闭设备加密,否则安装过程中会报:bitlocker加密需要解除 3、设置bios…

SpringMVC《学习笔记(21版尚硅谷)》

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1…

Form表单(antd-design组件库)简单使用以及单一检查规则

1.Form表单 高性能表单控件&#xff0c;自带数据域管理。包含数据录入、校验以及对应样式。 2.何时使用 用于创建一个实体或收集信息。 需要对输入的数据类型进行校验时。 组件代码来自&#xff1a; 表单 Form - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-de…

chatgpt赋能python:Python如何变大字体的SEO技巧

Python如何变大字体的SEO技巧 在网页设计和优化中&#xff0c;使用合适的字体和字体大小是至关重要的。对于使用Python编程的开发人员和网站管理员来说&#xff0c;如何使Pyhton代码中的字体变大是一个非常有用的技巧。在本文中&#xff0c;我们将介绍几种方法来增大Python代码…

C语言7:输入若干个学生的成绩,统计出平均成绩

在程序编辑区编写程序&#xff0c;给定程序功能是: 从键盘上输入若干个学生的成绩&#xff0c;统计出平均成绩&#xff0c;并输出低于平均分的学生成绩&#xff0c;用输入负数结束输入。 例如输入: 70 80 90 -1 输出: ave 80.00 --------OUTPUT----------- 70.0 程序有…

【茶话数据结构】查找最短路径——Dijkstra算法详解(保姆式详细图解,步步紧逼,保你学会)

&#x1f4af; 博客内容&#xff1a;【茶话数据结构】查找最短路径——Dijkstra算法详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f989;所属专栏&#xff1a;数据结构笔记 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实…

软考A计划-电子商务设计师-模拟试题卷一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

chatgpt赋能python:Python抢票的绝招

Python 抢票的绝招 随着互联网技术的不断发展&#xff0c;越来越多的人开始享受网购的便利。但是&#xff0c;随着一些热门事件的到来&#xff0c;如演唱会、体育比赛等&#xff0c;大家面临同一个问题&#xff1a;如何抢到热门事件的门票&#xff1f;这时&#xff0c;Python …

Win10利用剪贴板多次粘贴

工作中需要经常复制粘贴图片&#xff0c;每次ctrl C, ctrl V来回切换效率很低 网上有很多剪贴板增强工具&#xff0c;但win10本身有增强版的功能 多次复制后&#xff0c;在需要粘贴的地方按下&#xff0c;Windows徽标 V&#xff0c;就会出现所有复制过的内容 需要哪个直接点…

2023/06/05 PM Day4 软件项目生存期和生命周期

视频参考地址&#xff1a; B站闫波软件项目管理视频学习. 视频资源&#xff1a;video P4-P6 本篇重点&#xff1a;项目生存期 简书日更计划同步记录&#x1f3c3;… 项目生命周期 软件项目生命周期 *项目生命周期的阶段 C概念/启动阶段&#xff1a;确立项目需求和目标D开发/计…

chatgpt赋能python:Python如何把数据存到字典

Python如何把数据存到字典 字典是Python中非常有用的数据类型之一&#xff0c;它允许您将值与唯一的键相关联&#xff0c;从而快速地查找、插入和删除数据。在这篇文章中&#xff0c;我们将介绍如何使用Python将数据存储到字典中。 什么是字典&#xff1f; 字典是Python中的…

[开发板]001瑞芯微3588s开发记录--装一个仿真环境

文章目录 前言1. 构建python环境2 模型转换 前言 我是一个开发板的新手&#xff0c;刚买了一个瑞芯微3588s的板子&#xff0c;目标是要学习嵌入式的开发&#xff0c;也就是说把深度学习的框架&#xff0c;跑到板子上。万丈高楼平地起步。先把仿真环境搭建起来。 仿真环境可以跑…

趣未来科技董事长黄婵娇:专注创新研发,把公司当做科研机构来运作!

身为研发型董事长&#xff0c;黄婵娇女士谈及“技术”&#xff0c;眼中总是透着由衷的自豪。她的办公室摆满了各类技术文件以及图纸&#xff0c;以身作则将技术研发基因带入公司核心运维&#xff0c;强势带动深圳市趣未来&#xff08;B2GO&#xff09;科技有限公司一步步成长为…

电赛备赛日记(一):K210与STM32串口通信

拖更了n久的备赛日记终于来啦&#xff0c;最近实现了关于K210图像识别并将所需数据&#xff08;即目标类别&#xff0c;目标在图像中的加权坐标&#xff09;其中&#xff0c;加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐标加权&#xff0c;希望以此来判断目标…

海云捷讯杯 赛后总结 目标检测——缺陷检测(模型训练部分)

在这次比赛中&#xff0c;本人在队伍中主要负责模型训练部分&#xff0c;所以本文主要讲述如何使用PaddleDetection代码自定义数据集进行目标检测&#xff0c;欢迎大家纠错讨论哦&#xff0c;不胜荣幸~ 参考项目&#xff1a; SSDquexianjiance - 飞桨AI Studio (baidu.com) 感…