LeetCode6 Z字形排列
题目描述是从上到下,从左到右Z字形排列。
找规律.这种形式一般都是mod x 余数有规律。然后写的时候围绕x构造,而非判断,代码会简单一些。
设行数为r
先观察r=5的情况
发现第0行的字符原始index mod 8 ==0
第1行 mod 8 ==1 或7(-1)
...
第4行 mod 8 == 4 (-4)
也就是mod 2r-2
余0,±1,±2...±r-1
然后直接写就行。
简单写法在于,不判断index,而是直接构造,0+mod,0+mod-1;1+mod,1+mod-1,1+2*mod,1+2*mod-1;...
时间 O(n)
- class Solution {
- public:
- string convert(string s, int numRows) {
- if (numRows == 1) return s;
- string ret;
- int len = s.length();
- int mod = 2 * numRows - 2;
- for (int i = 0; i < numRows; i++) {
- for (int j = 0; j + i < len; j += mod) {
- ret += s[j + i];
- if (i != 0 && i != numRows - 1 && j + mod - i < len)
- ret += s[j + mod - i];
- }
- }
- return ret;
- }
- };
然后看了看题解,还有一种办法是分别构造每行,然后加起来。巧妙之处是设置了up和down,一个个字符判断。但是空间复杂度高一点,然后时间级别虽然一样但是会多一点。
使用当前行和当前方向这两个变量对合适的行进行跟踪。
只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。
- class Solution {
- public:
- string convert(string s, int numRows) {
- if (numRows == 1) return s;
- vector<string> rows(min(numRows, int(s.size())));
- int curRow = 0;
- bool goingDown = false;
- for (char c : s) {
- rows[curRow] += c;
- if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
- curRow += goingDown ? 1 : -1;
- }
- string ret;
- for (string row : rows) ret += row;
- return ret;
- }
- };
LeetCode6 Z字形排列的更多相关文章
- [Swift]LeetCode6. Z字形变换 | ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- LeetCode6.Z字形变换 JavaScript
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
- Leetcode6. Z 字形变换
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,按下右上下右上排列后输出字符串 题目描述: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列 ...
- Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
- LeetCode(6):Z字形转换
Medium! 题目描述: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状) P A H N A P L S I I G Y I R 之后按 ...
随机推荐
- C++ STL getline()函数
getline() C++11 <string> 函数原型 //(1) istream& getline (istream& is, string& str, ch ...
- 面试官问我CAS,我一点都不慌
文章以纯面试的角度去讲解,所以有很多的细节是未铺垫的. 文章中写到的处理线程安全的思路每一项技术都可以写出一篇文章,AQS.Synchronized.Atomic...周末肝起来!下周再来给大家安排! ...
- scrapy框架基于管道的持久化存储
scrapy框架的使用 基于管道的持久化存储的编码流程 在爬虫文件中数据解析 将解析到的数据封装到一个叫做Item类型的对象 将item类型的对象提交给管道 管道负责调用process_item的方法 ...
- apk开发环境!多亏这份《秋招+金九银十-腾讯面试题合集》跳槽薪资翻倍!再不刷题就晚了!
开头 最近很多网友反馈:自己从各处弄来的资料,过于杂乱.零散.碎片化,看得时候觉得挺有用的,但过个半天,啥都记不起来了.其实,这就是缺少系统化学习的后果. 为了提高大家的学习效率,帮大家能快速掌握An ...
- git 分支合并时如何忽略某个文件
[转]git 分支合并时如何忽略某个文件 - 神奇的旋风 - 博客园 https://www.cnblogs.com/xuan52rock/p/13268872.html Git - git-merg ...
- 20201101gryz模拟赛解题报告
写在前面 2020rp++ 停课的第一场模拟赛 拿上一年的上一年的day1来考的, 结果得分期望220pts,实际135pts,rank3,太菜了 考着考着机房灯突然灭了,当时慌的一批 以为断电代码要 ...
- 3D运动类申明与实现
#ifndef PKM3D_H #define PKM3D_H #include"kinematics.h" #include"Inventor/Qt/viewers/S ...
- Eslint错误提示
"Missing semicolon." : "缺少分号.","Use the function form of \"use strict\ ...
- CAS+Tomcat SSL第三方数据证书导入(jks)
首先,为CAS SERVER配置HTTPS 切换到证书 xxx.jks的目录下,查看证书的信息 keytool -list -keystore XXX.jks -storepass **** XX ...
- python输出乘法口诀
for i in range(1,10): for j in range(1,i+1): print (" ".join(["%d*%d=%d" %(j,i,i ...