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

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

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)暂停更


目录
相关文章
|
10天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
27 3
|
10天前
|
Java
在Java的世界里,Set只接纳独一无二的元素。
【10月更文挑战第16天】在Java的世界里,Set只接纳独一无二的元素。本文通过拟人化的手法,讲述了重复元素从初次尝试加入Set被拒绝,到经历挣扎、反思,最终通过改变自己,成为独特个体并被Set接纳的全过程。示例代码展示了这一过程的技术实现。
20 1
|
3月前
|
存储 算法 Java
Arraylist 在 Java 中能容纳多少个元素?
【8月更文挑战第23天】
93 0
|
3月前
|
存储 Java
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之AsyncCache中移除一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之AsyncCache中移除一个缓存元素的问题如何解决
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
|
10天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
19 4
|
12天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
16 5
|
10天前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
22 2
|
12天前
|
Java
Java Set 是一个不包含重复元素的集合接口,确保每个元素在集合中都是唯一的
【10月更文挑战第14天】Java Set 是一个不包含重复元素的集合接口,确保每个元素在集合中都是唯一的。本文介绍了 Set 的独特特性和两个常用实现类:基于哈希表的 HashSet 和基于红黑树的 TreeSet。通过示例代码展示了它们如何高效地处理唯一性约束的数据。
31 3