Rust每日一练(Leetday0020) 最后单词的长度、螺旋矩阵II、排列序列

news2024/11/29 0:42:42

目录

58. 最后一个单词的长度 Length of Last Word  🌟

59. 螺旋矩阵 II Spiral Matrix II  🌟🌟

60. 排列序列 Permutation Sequence  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


58. 最后一个单词的长度 Length of Last Word

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是“moon”,长度为4。

示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。

提示:

  • 1 <= s.length <= 10^4
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

代码1:

将字符串按照空格分割成多个子字符串,然后取最末的字符串长度即可。 

fn length_of_last_word(s: String) -> i32 {
    let strs: Vec<&str> = s.trim().split(' ').collect();
    for i in (0..strs.len()).rev() {
        if !strs[i].is_empty() {
            return strs[i].len() as i32;
        }
    }
    return 0;
}

fn main() {
    let s = "Hello World".to_string();
    println!("{:?}", length_of_last_word(s));

    let s = "   fly me   to   the moon  ".to_string();
    println!("{:?}", length_of_last_word(s));

    let s = "luffy is still joyboy".to_string();
    println!("{:?}", length_of_last_word(s));
}

代码2:

反向遍历:从字符串末尾开始向前遍历,找到第一个不为空格的字符,然后再向前遍历,直到遇到空格或到达字符串开头为止,这段子字符串的长度即为最后一个单词的长度。

fn length_of_last_word(s: String) -> i32 {
    let bytes = s.into_bytes();
    let n = bytes.len();
    let mut i = n as isize - 1;
    while i >= 0 && bytes[i as usize] == b' ' {
        i -= 1;
    }
    if i < 0 {
        return 0;
    }
    let mut j = i;
    while j >= 0 && bytes[j as usize] != b' ' {
        j -= 1;
    }
    return (i - j) as i32;
}

fn main() {
    let s = "Hello World".to_string();
    println!("{:?}", length_of_last_word(s));

    let s = "   fly me   to   the moon  ".to_string();
    println!("{:?}", length_of_last_word(s));

    let s = "luffy is still joyboy".to_string();
    println!("{:?}", length_of_last_word(s));
}

输出:

5
4


59. 螺旋矩阵 II Spiral Matrix II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

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

提示:

  • 1 <= n <= 20

代码1:

按层模拟 按照从外到内的顺序,依次填入矩阵中的每一个元素。 

fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
    let mut matrix = vec![vec![0; n as usize]; n as usize];
    let (mut num, mut left, mut right, mut top, mut bottom) = (1, 0, n - 1, 0, n - 1);
    while left <= right && top <= bottom {
        for i in left..=right {
            matrix[top as usize][i as usize] = num;
            num += 1;
        }
        for i in top + 1..=bottom {
            matrix[i as usize][right as usize] = num;
            num += 1;
        }
        if left < right && top < bottom {
            for i in (left..right).rev() {
                matrix[bottom as usize][i as usize] = num;
                num += 1;
            }
            for i in (top + 1..bottom).rev() {
                matrix[i as usize][left as usize] = num;
                num += 1;
            }
        }
        left += 1;
        right -= 1;
        top += 1;
        bottom -= 1;
    }
    matrix
}

fn main() {
    let n = 3;
    println!("{:?}", generate_matrix(n));
    println!("{:?}", generate_matrix(1));
}

代码2:

模拟转圈 用四个变量分别记录当前填数位置所在的行列范围,然后按照“向右、向下、向左、向上”的顺序不断填入数值,每填入一个数就更新当前位置和范围。

fn generate_matrix(n: i32) -> Vec<Vec<i32>> {
    let mut matrix = vec![vec![0; n as usize]; n as usize];
    let mut num = 1;
    let mut row = 0;
    let mut col = 0;
    let mut direction = 0;
    let directions = vec![vec![0, 1], vec![1, 0], vec![0, -1], vec![-1, 0]];
    while num <= n * n {
        matrix[row as usize][col as usize] = num;
        num += 1;
        let next_row = row + directions[direction][0];
        let next_col = col + directions[direction][1];
        if next_row < 0 || next_row >= n || next_col < 0 || next_col >= n || matrix[next_row as usize][next_col as usize] != 0 {
            direction = (direction + 1) % 4;
        }
        row += directions[direction][0];
        col += directions[direction][1];
    }
    matrix
}

fn main() {
    let n = 3;
    println!("{:?}", generate_matrix(n));
    println!("{:?}", generate_matrix(1));
}

输出:

 [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
[[1]]


60. 排列序列 Permutation Sequence

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123" "132" "213" "231" "312" "321"

给定 n 和 k,返回第 k 个排列。

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

提示:

  • 1 <= n <= 9
  • 1 <= k <= n!

代码: 回溯法

use std::convert::TryInto;

fn factorial(n: usize) -> usize {
    (1..=n).product()
}

fn get_permutation(n: i32, k: i32) -> String {
    let mut nums: Vec<i32> = (1..=n).collect();
    let mut res = String::new();
    nums.sort();
    let mut k = k - 1;
    for i in (1..=n).rev() {
        let f = factorial((i-1).try_into().unwrap()) as i32;
        let index = (k / f) as usize;
        res.push_str(&nums[index].to_string());
        nums.remove(index);
        k %= f;
    }
    res
}

fn main() {
    let n = 3;
    let k = 3;
    let s = get_permutation(n, k);
    println!("{}", s);

    let n = 4;
    let k = 9;
    let s = get_permutation(n, k);
    println!("{}", s);

    let n = 3;
    let k = 1;
    let s = get_permutation(n, k);
    println!("{}", s);
}

输出:

213
2314
123


🌟 每日一练刷题专栏 🌟

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

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

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

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

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

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

相关文章

Java企业级信息系统开发学习笔记14 Spring Boot(使用Spring Initializr方式构建Spring Boot项目)

文章目录 一、使用Spring Initializr方式构建Spring Boot项目&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建控制器&#xff08;三&#xff09;运行入口类&#xff08;四&#xff09;访问Web页面&#xff08;五&#xff09;修改访问映射路径 一…

OpenMMLab-AI实战营第二期-MMPose代码介绍

课程介绍 原始视频链接&#xff1a; 安装MMDetection和MMPose&#xff1a;https://www.bilibili.com/video/BV1Pa4y1g7N7 MMDetection三角板目标检测&#xff1a;https://www.bilibili.com/video/BV1Lm4y1879K MMPose、RTMPose三角板关键点检测&#xff1a;https://www.bilibi…

chatgpt赋能python:Python取消Import:改变编程世界的未来发展趋势

Python取消Import&#xff1a;改变编程世界的未来发展趋势 Python是一门非常流行的编程语言&#xff0c;它是开源的&#xff0c;因此得到了许多人的喜爱。然而&#xff0c;在Python的发展过程中&#xff0c;有些人认为现有的模块和包管理方式不够理想&#xff0c;需要进行改进…

视频压缩的工作原理

一、说明 当你正在观看你最喜欢的节目&#xff0c;出现缓冲的时候&#xff0c;这是什么原因&#xff1f;当 Wi-Fi 带宽不足以下载传输视频流所需的数据时&#xff0c;就会发生缓冲。也有可能是视频网站发布了未压缩版本的视频文件&#xff0c;因此视频文件太大而无法流畅地流式…

Linux常用命令——grpconv命令

在线Linux命令查询工具 grpconv 用来开启群组的投影密码 补充说明 grpconv命令用来开启群组的投影密码。Linux系统里的用户和群组密码&#xff0c;分别存放在/etc目录下的passwd和group文件中。因系统运作所需&#xff0c;任何人都得以读取它们&#xff0c;造成安全上的破绽…

Linux——TCP协议2

目录 确认应答(ACK)机制 超时重传机制 连接管理机制 流量控制 滑动窗口 快重传VS超时重传 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 基于TCP应用层协议 TCP/UDP对比 用UDP实现可靠传输 listen 的第二个参数 确认应答(ACK)机制 TCP将每个字节的数…

力扣高频SQL50题(基础版)——第五天

力扣高频SQL50题(基础版)——第五天 1 至少有5名直接下属的经理 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 #①找到经理的所有编号②让其与员工表内连接,然后分组筛选即可 SELECT e1.name FROM (SELECT id,nameFROM EmployeeWHERE managerId IS…

Vmware虚拟机实例配置静态IP

最近在给虚拟机配置静态IP的时候&#xff0c;出了一些小问题&#xff0c;本文主要描述操作过程中一些小问题的解决。 主要参考资料: How to set up Linux in VMWare Workstation with static IP (IPv4) 个人配置信息: VMware Workstation Debian 记录一下虚拟机的网卡信息 …

文本编辑器

章节目录&#xff1a; 一、Vim 编辑器1.1 检查 vim 软件包1.2 vim 基础1.3 命令模式1.4 输入模式1.5 底线命令模式&#xff08; Ex 模式 &#xff09; 二、nano 编辑器三、结束语 一、Vim 编辑器 vi 编辑器是 Unix 系统中最早的编辑器之一。vim 是从 vi 发展出来的一个文本编辑…

GTK官方教程

前言&#xff1a; 让你在开发中爱不释手的 GT 包。关注GSLS官网&#xff0c;查看更多源码 ヾ(✿&#xff9f;▽&#xff9f;)ノ工具包。 所有文章 小编尽量让读者可以 直接 读懂 与 完全 复制粘贴&#xff0c;其中复杂或较多 的源码 会有 源码 并 贴上 github 网址。 GT 类 里面…

图文并茂教你快速入门React系列04-状态管理

在React中&#xff0c;什么是状态&#xff1f; 响应式 使用 React&#xff0c;你不用直接从代码层面修改 UI。举个栗子哇&#xff0c;不用编写诸如“禁用按钮”、“启用按钮”、“显示成功消息”等命令。相反&#xff0c;你只需要描述组件在不同状态&#xff08;“初始状态”…

chatgpt赋能python:Python另存为在哪:一篇SEO指南

Python另存为在哪&#xff1a;一篇SEO指南 简介 Python是目前最流行的编程语言之一&#xff0c;它的高效性和易用性使得越来越多的人选择使用它来编写软件和web应用程序。然而&#xff0c;Python在保存文件时可能会有些棘手&#xff0c;尤其是在需要另存为不同格式或目录时。…

chatgpt赋能python:Python只取数字:你需要知道的一切

Python只取数字&#xff1a;你需要知道的一切 在当今数字化的时代&#xff0c;数字信息已经成为全球交流和经济活动的主要组成部分。因此&#xff0c;在处理数据时&#xff0c;我们经常需要从文件中提取数字信息。Python是一种广泛应用于数据处理和分析的编程语言&#xff0c;…

Java面向对象程序开发——基础

文章目录 前言类和对象类对象 构造方法匿名对象变量作用域this关键字总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Java 是一种以面向对象编程为基础的编程语言 在 Java 编程中&#xff0c;一切皆为对象 每个对象都有其自己的属性和方法 对象可以…

图论试题2021

25 A&#xff1a;最大度是7&#xff0c;大于了顶点数6&#xff0c;故不是简单图的度序列。 C&#xff1a;树的度序列至少要有两个度为1的顶点 D&#xff1a;只要度数为奇数的个数有偶数个&#xff0c;就是度序列。 A&#xff1a;每棵树的中心由一个点或两个相邻点组成 B&…

碳中和城市建筑能源系统(1):能源篇(龙惟定)2022

碳中和城市建筑能源系统(1):能源篇 碳中和城市建筑能源系统&#xff08;1&#xff09;&#xff1a;能源篇&#xff08;龙惟定&#xff09;2022 碳中和城市建筑能源系统&#xff08;2&#xff09;&#xff1a;网络篇&#xff08;龙惟定&#xff09;2022 碳中和城市建筑能源系统&…

chatgpt赋能python:Python可以用i++吗?——探讨Python自增自减运算符

Python可以用i吗&#xff1f;——探讨Python自增自减运算符 Python作为一门高级编程语言&#xff0c;一直以来都备受开发者们的喜爱。Python以代码简洁、语言简单易懂、易于学习等特点而赢得了广大开发者的信赖。然而&#xff0c;在Python中并没有i这样的自增自减运算符&#…

计算机网络第一章——计算机系统结构(下)

提示&#xff1a;总角之宴&#xff0c;言笑晏晏。信誓旦旦&#xff0c;不思其反。反是不思&#xff0c;亦已焉哉。 文章目录 1.2.1 分层结构&#xff0c;协议&#xff0c;接口和服务为什么要有分层&#xff1f;怎么分层正式认识分层结构概念总结 1.2.2 OSI 参考模型ISO参考模型…

软考A计划-电子商务设计师-电子商务系统分析与设计

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

【JUC基础】14. ThreadLocal

目录 1、前言 2、什么是ThreadLocal 3、ThreadLocal作用 4、ThradLocal基本使用 4.1、创建和初始化 4.2、存储和获取线程变量 4.3、清理和释放线程变量 4.4、小结 4.5、示例代码 5、ThreadLocal原理 5.1、set() 5.2、get() 5.3、变量清理 5.4、ThreadLocalMap 6、…