6. Z 字形变换 leetcode
发布日期:2021-06-20 05:37:05 浏览次数:4 分类:技术文章

本文共 1431 字,大约阅读时间需要 4 分钟。

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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

分析:

本题可以使用数学方法分析,可以直接推导出第i个字符的行和列数。但是推导需要时间并且短时间内公式不一定正确。所以我们采用模拟-输出的放法:模拟将字符按z字形排列,但是不存贮中间结果(每个字符的行列数)直接将字符放到对应行数的队列中,后期只需将所有行拼接在一起输出即可。

 

class Solution {    public String convert(String s, int numRows) {        List
list = new ArrayList<>(); for (int i = 0; i < numRows; i++) { //每一行的字符存在一起 list.add(new StringBuilder()); } int rowNum =0; boolean up=false; //向上遍历 for (int i = 0; i < s.length(); i++) { if (up) list.get(rowNum--).append(s.charAt(i)); else if (!up) list.get(rowNum++).append(s.charAt(i)); rowNum = rowNum > numRows-1 ?numRows-1 : rowNum; //控制边界 rowNum = rowNum < 0 ? 0: rowNum; if (rowNum==0 || rowNum==numRows-1){ //更新遍历方向 up = rowNum==0 ?false:true; } } StringBuilder result = new StringBuilder(); //拼接结果 for (StringBuilder sb:list) { result.append(sb); } return result.toString(); }}

 

转载地址:https://blog.csdn.net/h2453532874/article/details/88363512 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:腾讯实习生机试题 [编程题] 算法基础-字符移位
下一篇:华为暑期实习生技术面试(电话面试)部分问题及解答

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月21日 15时59分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章