小编给大家分享一下leetcode如何解决Z字形变换问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
https://leetcode-cn.com/problems/zigzag-conversion/
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING"
行数为 3 时,排列如下:
L C I RE T O E S I I GE D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4输出: "LDREOEIIECIHNTSG"解释:L D RE O E I IE C I H NT S G
标签:字符串
整体的思路是遍历字符串,遍历过程中将每行都看成新的字符串构成字符串数组,最后再将该数组拼接起来即可
如果numRows=1则说明当前字符串即为结果,直接返回
否则整个字符串需要经历,向下向右,向下向右,这样的反复循环过程,设定down变量表示是否向下,loc变量表示当前字符串数组的下标
如果down为true,则loc+=1,字符串数组下标向后移动,将当前字符加入当前字符串中
如果down为false,则表示向右,则loc-=1,字符串数组下标向前移动,将当前字符加入当前字符串中
时间复杂度:O(n),n为字符串s的长度
Java版本
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; }}
JavaScript版本
/** * @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;};
看完了这篇文章,相信你对“leetcode如何解决Z字形变换问题”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/2446442/blog/4380074