每天一道Rust-LeetCode(2019-06-02)
每天一道Rust-LeetCode(2019-06-02) Z 字形变换
坚持每天一道题,刷题学习Rust.
LeetCode原题
Z 字形变换
题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解题过程
关键思路如下:
找对每个位置对应的坐标,都是可以计算出来的
解释:
0 2n-2 4n-4
L D R
E O E I I
E C I H N
T S G
n-1 3n-3 5n-5
impl Solution {
pub fn convert(s: String, num_rows: i32) -> String {
if num_rows <= 1 {
return s;
}
let lens = s.len();
let s = s.as_bytes();
let mut s2 = String::new();
let n = num_rows as usize;
let t = n - 1;
//一行为单位向下走,计算每列的位置
for r in 0..n {
//最多也就是n列了,
for c in 0..(lens / n + 1) {
if r == 0 {
//0,2n-2,4n-4
let i = c * 2 * (n - 1);
if i >= lens {
continue;
}
s2.push(s[i] as char);
} else if r == t {
//n-1 3n-3 5n-5
let i = (c * 2 + 1) * (n - 1);
if i >= lens {
continue;
}
s2.push(s[i] as char);
} else {
let first = c * 2 * (n - 1) + r;
let last = (c + 1) * 2 * (n - 1) - r;
// println!("first={},last={}", first, last);
if first >= lens {
continue;
}
s2.push(s[first] as char);
if last >= lens {
continue;
}
s2.push(s[last] as char);
//每行有两个,注意先后顺序
}
}
}
s2
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_conversion() {
assert_eq!(
"LCIRETOESIIGEDHN",
Solution::convert(String::from("LEETCODEISHIRING"), 3)
);
assert_eq!(
"LDREOEIIECIHNTSG",
Solution::convert(String::from("LEETCODEISHIRING"), 4)
);
assert_eq!(
"LEETCODEISHIRING",
Solution::convert(String::from("LEETCODEISHIRING"), 1)
);
}
}
一点感悟
由于不熟悉rust标准库,String转字符Slice,u8和char之间的转换都要查文档.
其他
欢迎关注我的github,本项目文章所有代码都可以找到.
每天一道Rust-LeetCode(2019-06-02)的更多相关文章
- leetcode面试题 02.06. 回文链表,解题心路
目录 leetcode面试题 02.06. 回文链表,解题心路 1.题目描述 2.java语言题解一 3.java语言题解二 4.C语言题解一 leetcode面试题 02.06. 回文链表,解题心路 ...
- BlackArch Linux 2019.06.01 宣布发布
导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- LeetCode 面试题 02.06. 回文链表
题目链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci/ 编写一个函数,检查输入的链表是否是回文的. 示例 1: 输入: 1 ...
- leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏
for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for t ...
- EZ 2018 06 02 NOIP2018 模拟赛(十七)
这次的比赛是真心比较狗,我TM的写了30min的树剖ZZ地直接memset超时了 话说我既然想到差分就应该去写差分的啊! 好了不过这次Rank还挺高的,终于要打进前10了当然是假的了. 好了下面开始讲 ...
- 2019.03.02 ZJOI2019模拟赛 解题报告
得分: \(10+0+40=50\)(\(T1\),\(T3\)只能写大暴力,\(T2\)压根不会) \(T1\):道路建造 应该是一道比较经典的容斥题,可惜比赛时没有看出来. 由于要求最后删一条边或 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 【纪中集训】2019.08.02【NOIP提高组】模拟 A 组TJ
\(\newcommand{\RNum}[1]{\uppercase\expandafter{\romannumeral #1\relax}}\) T1 一道可以暴力撵标算的题-- Descripti ...
- [自学] MIT的EECS本科+研究生课程【持续更新中-2020.06.02】
前言 我的本科是读的电子信息工程,研究生跟着老师做项目,参与到深度学习中来,毕业后做了算法工程师,工作之后愈发发现,不论从事什么岗位,基础都很重要,但现在也没有时间再读一遍本科了,自学的话也不知道从何 ...
随机推荐
- ORACLE 10g 升级 11g问题汇总(转载文)
按照计划开始了生产库的升级,环境基于linux 64位. uname: Linux 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 ...
- C# socket ipv6初体验
Server: serverSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp) ...
- for...in 、for...of 、forEach 的区别
无论是for…in还是for…of语句都是迭代一些东西.它们之间的主要区别在于它们的迭代方式. 1.for…in 语句以原始插入顺序迭代对象的可枚举属性.2.for…of 语句遍历可迭代对象定义要迭代 ...
- 我的周记10——“知行合一"
印象中有个名人说过一句名言:与其游手好闲地学习,不如学习游手好闲 来自 玉伯 . 字是真的好看,有风格 现在已经是第十篇周记了,写着写着慢慢偏离了初衷,但庆幸的是坚持下来写.我相信在用心写好每篇周记 ...
- [转帖]CHROME开发者工具的小技巧
CHROME开发者工具的小技巧 https://coolshell.cn/articles/17634.html 需要仔细学习看一看呢. 2017年01月19日 陈皓 评论 58 条评论 64,08 ...
- Sitecore XP 8.2 新功能
Sitecore的®体验平台™ 8.2是最全面的更新最新的一个,平衡增强现有客户,而在同一时间提供了引人注目的新功能.你可以在这里阅读新闻稿,但我想对8.2中的一些重大变化给予一些额外的关注.作为奖励 ...
- 常见HTTP响应状态码
分类 分类 分类描述 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语法错误或无法完成 ...
- Mysql系列(五)—— 分页查询及问题优化
一.用法 在Mysql中分页查询使用关键字limit.limit的语法如下: SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 limit关键字带有 ...
- Java 8——日期时间工具库(java.time)
一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...
- C# vb .NET读取识别条形码线性条码CODE93
code93是比较常见的条形码编码规则类型的一种.如何在C#,vb等.NET平台语言里实现快速准确读取该类型条形码呢?答案是使用SharpBarcode! SharpBarcode是C#快速高效.准确 ...