Rust每日一练(Leetday0015) 字符串相乘、通配符匹配、跳跃游戏II

简介: Rust每日一练(Leetday0015) 字符串相乘、通配符匹配、跳跃游戏II

43. 字符串相乘 Multiply Strings

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"


提示:

  • 1 <= num1.length, num2.length <= 200
  • num1num2 只能由数字组成。
  • num1num2 都不包含任何前导零,除了数字0本身。

代码:

fn multiply(num1: String, num2: String) -> String {
    if num1 == "0" || num2 == "0" {
        return String::from("0");
    }
    let (m, n) = (num1.len(), num2.len());
    let mut ans_arr: Vec<i32> = vec![0; m+n];
    let num1_bytes = num1.as_bytes();
    let num2_bytes = num2.as_bytes();
    for i in (0..m).rev() {
        let x = (num1_bytes[i] - b'0') as i32;
        for j in (0..n).rev() {
            let y = (num2_bytes[j] - b'0') as i32;
            ans_arr[i + j + 1] += x * y;
        }
    }
    for i in (1..m+n).rev() {
        ans_arr[i - 1] += ans_arr[i] / 10;
        ans_arr[i] %= 10;
    }
    let mut idx = 0;
    while idx < m+n && ans_arr[idx] == 0 {
        idx += 1;
    }
    let ans_bytes: Vec<u8> = ans_arr[idx..].iter().map(|x| (*x as u8) + b'0').collect();
    String::from_utf8(ans_bytes).unwrap()
}
fn main() {
    println!("{}", multiply(String::from("123"), String::from("456")));
}

输出:

56088


44. 通配符匹配 Wildcard Matching

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?''*' 的通配符匹配。

'?' 可以匹配任何单个字符。

'*' 可以匹配任意字符串(包括空字符串)。


两个字符串完全匹配才算匹配成功。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ?*

示例 1:

输入:

s = "aa"

p = "a"

输出: false

解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:

s = "aa"

p = "*"

输出: true

解释: '*' 可以匹配任意字符串。


示例 3:

输入:

s = "cb"

p = "?a"

输出: false

解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。


示例 4:

输入:

s = "adceb"

p = "*a*b"

输出: true

解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".


示例 5:

输入:

s = "acdcb"

p = "a*c?b"

输出: false


代码:

fn is_match(s: &str, p: &str) -> bool {
    let (mut si, mut pi) = (0, 0);
    let (mut s_si, mut p_si) = (0, 0);
    let s_bytes = s.as_bytes();
    let p_bytes = p.as_bytes();
    while si < s_bytes.len() {
        if pi < p_bytes.len() && (s_bytes[si] == p_bytes[pi] || p_bytes[pi] == b'?') {
            si += 1;
            pi += 1;
        } else if pi < p_bytes.len() && p_bytes[pi] == b'*' {
            s_si = si;
            p_si = pi;
            pi += 1;
        } else if p_si == usize::MAX {
            return false;
        } else {
            s_si += 1;
            si = s_si;
            pi = p_si + 1;
        }
    }
    while pi < p_bytes.len() && p_bytes[pi] == b'*' {
        pi += 1;
    }
    pi == p_bytes.len()
}
fn main() {
    println!("{}", is_match("aa", "*"));
    println!("{}", is_match("adceb", "*a*b"));
    println!("{}", is_match("acdcd", "a*c?b"));
}

输出:

true

true

false


45. 跳跃游戏 II Jump Game II

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例 1:

输入: nums = [2,3,1,1,4]

输出: 2

解释: 跳到最后一个位置的最小跳跃数是 2。

    从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。


示例 2:

输入: nums = [2,3,0,1,4]

输出: 2


提示:

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 1000

代码:

fn jump(nums: Vec<i32>) -> i32 {
    let (mut end, mut max_pos, mut steps) = (0, 0, 0);
    for i in 0..nums.len()-1 {
        max_pos = max(max_pos, i + nums[i] as usize);
        if i == end {
            end = max_pos;
            steps += 1;
        }
    }
    steps
}
fn max(a: usize, b: usize) -> usize {
    if a > b {
        a
    } else {
        b
    }
}
fn main() {
    println!("{}", jump(vec![2, 3, 1, 1, 4]));
    println!("{}", jump(vec![2, 3, 0, 1, 4]));
}

输出:

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


目录
相关文章
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
693 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
6月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
649 7
|
8月前
|
存储 算法 区块链
从零实现Python扫雷游戏:完整开发指南与深度解析
扫雷作为Windows经典游戏,承载了许多人的童年回忆。本文将详细介绍如何使用Python和Tkinter库从零开始构建一个功能完整的扫雷游戏,涵盖游戏设计、算法实现和界面开发的全过程。
633 0
|
9月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
1099 1
|
9月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
697 0
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
686 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
346 33
|
IDE 开发工具 Python
Python扑克游戏编程---摸大点
Python扑克游戏编程---摸大点
247 1

推荐镜像

更多