Leetcode 006. 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"
Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/
示例2:
输入: s = "LEETCODEISHIRING", numRows =4
输出:"LDREOEIIECIHNTSG"
解释:L D R
E O E I I
E C I H N
T S G
难度:
- 难度:中等
- 支持语言:JavaScript、Java、Python
相关标签
- 字符串
- Js中文网 - 全球前端挚爱的技术成长平台
相关企业
- 阿里
- 腾讯
- 微保
- 有赞
思路 1:
通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行,
我们可以使用 min(numRows,len(s)) 个列表来表示 Z 字形图案中的非空行。
从左到右迭代 ss,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。
只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。
算法流程: 按顺序遍历字符串 s;
res[i] += c
: 把每个字符c
填入对应行s i
;i += flag
: 更新当前字符c
对应的行索引;flag = - flag
: 在达到ZZ
字形转折点时,执行反向。
思路 2:
- 整体的思路是遍历字符串,遍历过程中将每行都看成新的字符串构成字符串数组,最后再将该数组拼接起来即可
- 如果
numRows=1
则说明当前字符串即为结果,直接返回 - 否则整个字符串需要经历,向下向右,向下向右,这样的反复循环过程,设定 downdown 变量表示是否向下,loc 变量表示当前字符串数组的下标
- 如果
downdown
为 true,则 loc+=1,字符串数组下标向后移动,将当前字符加入当前字符串中 - 如果
downdown
为 false,则表示向右,则 loc−=1,字符串数组下标向前移动,将当前字符加入当前字符串中
思路 3:
- 定义一个
rows
,它的作用是用来保存每一行的字母,根据题目,可以很轻松的得出第一个字母就在第1行
,第二个字母在第2行
…第N
个字母在第numsRow
行; - 然后开始往上,第
N+1
个字母在numsRow-1
行… - 因此遍历
s
,并且将每一个字母添加到对应的行中,最后在将每一行字母合并就是结果。
复杂度分析
- 时间复杂度 O(N)O(N) :遍历一遍字符串 s;
- 空间复杂度 O(N)O(N) :各行字符串共占用 O(N)O(N) 额外空间。
代码
JavaScript 实现
/*** @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容* @param {string} s* @param {number} numRows* @return {string}*/
var convert = function(s, numRows) {if(numRows===1)return slet rows={}for(let i=0;i<numRows;i++){rows[i]=[]}let curRow=0,direction=1for(let i=0;i<s.length;i++){rows[curRow].push(s[i])curRow+=directionif(curRow===numRows || curRow===-1){direction*=-1curRow+=2*direction}}// console.log(rows)let res=''for(let i=0;i<numRows;i++){res+=rows[i].join('')}return res
};
/**
* @作者:guanpengchn
* @链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/hua-jie-suan-fa-6-z-zi-xing-bian-huan-by-guanpengc/* @param {string} s* @param {number} numRows* @return {string}*/
var convert = function(s, numRows) {if(numRows == 1)return s;const len = Math.min(s.length, numRows);const rows = [];for(let i = 0; i< len; i++) rows[i] = "";let loc = 0;let down = false;for(const c of s) {rows[loc] += c;if(loc == 0 || loc == numRows - 1)down = !down;loc += down ? 1 : -1;}let ans = "";for(const row of rows) {ans += row;}return ans;
};/* 给推荐一个大家都在用的网站:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
Java 实现
/**
* @作者:guanpengchn
* @链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/hua-jie-suan-fa-6-z-zi-xing-bian-huan-by-guanpengc/*/
class Solution {public String convert(String s, int numRows) {if(numRows == 1)return s;int len = Math.min(s.length(), numRows);String []rows = new String[len];for(int i = 0; i< len; i++) rows[i] = "";int loc = 0;boolean down = false;for(int i=0;i<s.length();i++) {rows[loc] += s.substring(i,i+1);if(loc == 0 || loc == numRows - 1)down = !down;loc += down ? 1 : -1;}/* 给推荐一个大家都在用的网站:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */String ans = "";for(String row : rows) {ans += row;}return ans;}
}
/**
* @作者:guanpengchn
* @链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/hua-jie-suan-fa-6-z-zi-xing-bian-huan-by-guanpengc/*/
class Solution {public String convert(String s, int numRows) {if(numRows == 1)return s;int len = Math.min(s.length(), numRows);String []rows = new String[len];for(int i = 0; i< len; i++) rows[i] = "";int loc = 0;boolean down = false;for(int i=0;i<s.length();i++) {rows[loc] += s.substring(i,i+1);if(loc == 0 || loc == numRows - 1)down = !down;loc += down ? 1 : -1;}String ans = "";for(String row : rows) {ans += row;}return ans;}
}
/**
* @作者:jyd
* @链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/*/
class Solution {public String convert(String s, int numRows) {if(numRows < 2) return s;List<StringBuilder> rows = new ArrayList<StringBuilder>();for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());int i = 0, flag = -1;for(char c : s.toCharArray()) {rows.get(i).append(c);if(i == 0 || i == numRows -1) flag = - flag;i += flag;}StringBuilder res = new StringBuilder();for(StringBuilder row : rows) res.append(row);return res.toString();}
}/* 给推荐一个大家都在用的网站:Js 中 文 网 - 全球前端挚爱的技术成长平台 https://www.javascriptc.com/ */
Python 实现
# 作者:powcai
# 链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/mo-ni-guo-cheng-he-zhao-gui-lu-by-powcai/
class Solution:def convert(self, s: str, numRows: int) -> str:if not s:return ""if numRows == 1:return ss_Rows = [""] * numRowsi = 0n = len(s)while i < n:for j in range(numRows):if i < n:s_Rows[j] += s[i]i += 1for j in range(numRows-2,0,-1):if i < n:s_Rows[j] += s[i]i += 1return "".join(s_Rows)
# 作者:yun-yu-chen
# 链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/shu-xue-gui-lu-fa-hashfa-cpythonjavashi-xian-by-yu/
class Solution:def convert(self, s: str, numRows: int) -> str:if numRows==1:return sans=""n=len(s)for i in range(numRows):k=iwhile k<n:ans+=s[k]k+=2*(numRows-1)if i!=0 and i!=numRows-1 and k-2*i <n:ans+=s[k-2*i]return ans
# 作者:zoffer
# 链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/ji-jian-jie-fa-by-ijzqardmbd/class Solution:def convert(self, s: str, numRows: int) -> str:if numRows == 1: return srows = [""] * numRowsn = 2 * numRows - 2for i, char in enumerate(s):x = i % nrows[min(x, n - x)] += charreturn "".join(rows)
其他
- 原题leetcode链接:https://leetcode-cn.com/problems/zigzag-conversion/
- 合作方:JavaScript中文网 – 全球极客挚爱的技术成长平台
- 说明:leetcode 题解 | 每日一题
Leetcode 006. Z 字形变换 | 每日一题相关推荐
- Leetcode 6.Z 字形变换 (每日一题 20210630)
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列.比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A ...
- [模拟|字符串] leetcode 6 Z字形变换
[模拟|字符串] leetcode 6 Z字形变换 1.题目 题目链接 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHI ...
- LeetCode 6.z字形变换
LeetCode 6.z字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时, ...
- Java实现 LeetCode 6 Z字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- LeetCode——6. Z 字形变换
6. Z 字形变换(中等难度) 题目描述: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING ...
- LeetCode 6. Z 字形变换(找规律)
1. 题目 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...
- LeetCode 6. Z 字形变换 (N字形变换)
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P ...
- LeetCode 6 Z字形变换
将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"PAHNAP ...
- leetcode —— 6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
最新文章
- cannot import name ‘compare_ssim‘
- 初次使用Android Studio问题,Android Studio往项目中添加图片
- 学JS的心路历程 -非同步执行
- python如何计算个人gpa_使用While循环(Python)计算GPA
- nio的应用 java_Java NIO的理解和应用
- 【Flink】flink highavailabilityservices 源码解析
- html透明度_iMac下制作含透明度图片及判断图片透明度
- 没有博士学位,照样玩转TensorFlow深度学习
- PostgreSQL快速入门
- html 字体思源_CSS3嵌入字体@font-face调用字体(思源宋体regula/PingFang SC/ttf/woff)...
- Tomcat 的安装与配置
- 常用路由器的帐号和密码大全
- linux mingw32安装,在Linux上安装mingw
- 解决Windows聚焦不更新图片问题
- 免费图标:来自Samuray的免费电视/电影相关图标
- IDS和IPS是什么,有什么区别?
- 【第38题】2019年OCP认证12C题库062考试最新考试原题
- Retina屏下的图片优化
- Tomcat7源码环境搭建
- Palabos论坛笔记:升力系数的计算
热门文章
- IDEA中设置关闭标签页的快捷键
- longest-common-prefix[最长公共子序列]
- echart结合高德地图的数据可视化大数据展示平台模板
- STM32cubeIDE生成HEX文件
- 微信公众号开发——实现用户微信网页授权流程
- 用c语言模拟石头剪刀布小游戏
- 这18个网站能让你的页面背景炫酷起来
- 手机拍的照片计算机内存不足怎么办,手机内存不够用,照片应该怎么处理才能够少占用内存?...
- php源码 拼车网顺风车_php版某拼车网源码分享 微信拼车打车约车源码 微信拼车+手机拼车+双终端+发布平台...
- linux cp并打包目录,【linux】【qt5】【将linux下的qt程序打包发布(完全适用于中标麒麟)】...
- Leetcode 6.Z 字形变换 (每日一题 20210630)