6. Z 字形变换

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 6. Z 字形变换

本题来自LeetCode:6. Z 字形变换[1]

题目描述

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

L     D     R
E   O E   I I
E C   I H   N
T     S     G

题目分析

本题采用模拟法,依次将字符串的每个字符分配到每一行。 观察到规律如下:

  • 先从上至下,每行一个字符;
  • 再从左下至右上,除第一行和最后一行,每行一个字符;
  • 题目解答

    
    class Solution {
        public String convert(String s, int numRows) {
            // 记录每行的字符
            StringBuilder[] sbs = new StringBuilder[numRows];
            // 初始化
            for(int j = 0; j  numRows; j ++) {
                sbs[j] = new StringBuilder();
            }
            int i = 0;
            while(i  s.length()) {
                // 从上至下,numRows个字符
                for(int j = 0; j  numRows && i  s.length(); j ++) {
                    sbs[j].append(s.charAt(i ++));
                }
                // 左下角至右上角,numRows-2个字符
                for(int j = numRows - 2; j  0 && i s.length(); j --) {
                    sbs[j].append(s.charAt(i ++));
                }
            }
            // 整体连接起来
            for(int j = 1; j  numRows; j ++) {
                sbs[0].append(sbs[j]);
            }
            return sbs[0].toString();
        }
    }
    

    复杂度分析:
    时间复杂度: O(n) n为字符串长度
    空间复杂度: O(numRows)

    参考资料

    1. Z 字形变换: https://leetcode-cn.com/problems/zigzag-conversion

    原文始发于微信公众号(xiaogan的技术博客):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 6. Z 字形变换


      转载请注明: 好好学java 6. Z 字形变换

     上一篇
    179. 最大数 179. 最大数
    本题来自LeetCode:179. 最大数[1] 题目描述给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 95343
    2021-04-05
    下一篇 
    55. 跳跃游戏 55. 跳跃游戏
    55. 跳跃游戏本题来自LeetCode:55. 跳跃游戏[1] 题目描述给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1: 输入: [2,3,1
    2021-04-05