LeetCode 第6题 Z字型变换

LeetCode 第6题 Z字型变换

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行?Z 字形排列。
比如输入字符串为 "LEETCODEASHARANG"?行数为 3 时,排列如下:

L???C???A???R
E?T?O?E?S?A?A?G
E???D???H???N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCARETOESAAGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

整体思路

我们通过观察不难发现,character在行中的分布是有规律可循的:每一行里的character,它们都有一个共同点。以题目中给的例子来说,第一行“L, C, A, R",它们在原string中的index分别是”0, 4, 8, 12",而最后一行“E, D, H, N",它们在原string中的index分别是”2, 6, 10, 14"。大家可能已经发现这个规律了:同一行中的character的index符合一个等差数列,而我们能很轻易地得出这个等差数列的通项公式。对于第二行“E, T, O, E, S, A, A, G",它们在原string的index分别为”1, 3, 5, 7, 9, 11, 13",这项规律似乎也能适用,只是前后差有所变化。

但是当我们改变numRows就会发现,规律并不仅仅是等差数列这么简单。如果我们将numRow改为4后,那么第二行character的index分布将不再遵循等差数列的规律。读者可自行绘画尝试。这里直接给出numRow改为4后第二行character的index分布变为了"1, 4, 6, 9, 11, 14, 16..."读者可以看到这一串数仍然是符合一定的规律的。描述这种规律的方式有很多,这里我门就用一种最适合用计算机语言的方法去描述:这些数除以(numRow+1)的余数为"行数-1”或“numRow+2-行数”。将例子代入,1 mod 5 = 1, 4 mod 5 = 4, 6 mod 5 = 1, 9 mod 5 = 4......

我们只需应用这个规律,然后再遍历字符串的过程中把每个character加入到合适的行中,最后合并list,就能得到最后的答案

代码实现

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        # If the numRows is 1, no need for convertion
        if numRows == 1:
            return s
        # Divided the string into numrow parts
        # Each element in the list represent a row
        # Each row is initialzed as empty string
        string_list = list()
        for i in range(numRows):
            string_list.append("")
        # Divisor is determined by the numRows
        divisor = 2 * (numRows - 1)
        for i in range(0, len(s)):
            # Add the character to the correct place in the list
            index = i % divisor
            if index > divisor / 2:
                index = divisor - index
            string_list[index] += s[i]
        return ''.join(string_list)

原文地址:https://www.cnblogs.com/meloyang/p/12299969.html

时间: 2024-10-08 06:30:42

LeetCode 第6题 Z字型变换的相关文章

[LeetCode] Z字型变换

题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR" 实现一个将字符串进行指定行数变换的函数: string convert(string s, int numRows); 示例 1: 输入: s = "PAYPALISHIRING", numRows = 3 输出: "PAHNAPLSII

【LeetCode-面试算法经典-Java实现】【006-ZigZag Conversion(Z字型转换)】

[006-ZigZag Conversion(Z字型转换)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A

算法:Z字型(Zigzag)编排

问题:给定 n 行和 m 列的二维数组矩阵.如图所示,以 ZIG-ZAG 方式打印此矩阵. 从对称的角度来看,通过反复施加滑行反射可以从简单的图案如线段产生规则的之字形. 主要思想:算法从(0, 0)位置开始水平向右遍历,当到达(0, 1)时沿着反对角线方向左下遍历(利用一个变量控制左下右上方向),内层循环一直遍历到碰到边缘时row++,方向改为右上,沿着反对角线碰到矩阵上边缘时col++,方向变为左下遍历,知道上半部分(包括反对角线遍历完):遍历完半个矩阵(可能是子方矩阵)后,根据当前 row

LeetCode ZigZag Conversion(将字符串排成z字型)

1 class Solution { 2 public: 3 string convert(string s, int nRows) { 4 string a=""; 5 int len=s.length(); 6 if(len<=nRows||nRows==1) return s; //只有n个,不足一个周期||排成一行 7 int teams=len/(nRows*2-2); //teams个完整的周期 8 int rest=len%(nRows*2-2); //最后一个不足

281. Zigzag Iterator z字型遍历

[抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Input: v1 = [1,2] v2 = [3,4,5,6] Output: [1,3,2,4,5,6] Explanation: By calling next repeatedly until hasNext returns false,   the order of elements retur

leetcode第6题:Z字形变换--直接模拟求解法

[题目描述] 将一个给定字符串根据给定的行数,以从上往下.从左到右进行?Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING"?行数为 3 时,排列如下: 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN". 请你实现这个将字符串进行指定行数变换的函数: string convert(string s, int numRows); [解题思路] 对于Z字形,每行使用一个StringBuiler来记录,

NOIP2002 字串变换

题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: ‘abcd’->‘x

[LeetCode] ZigZag Converesion 之字型转换字符串

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: "PAHNAPLSII

lintcode 容易题:Matrix Zigzag Traversal 矩阵的之字型遍历

题目: 矩阵的之字型遍历 给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历. 样例 对于如下矩阵: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10, 11, 12] ] 返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12] 解题: 感觉很简单,就是没有搞出来,程序来源 ,这里是先右上走,我换成先横着走就是不对了,表示不理解.另外一种方法,表示也不理解. java程序: public class Solut