[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
输出: "PAHNAPLSIIGYIR"
示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"

  

思路:

找规律的题目,字符串各字母内容不管,找下标的规律,拿上面的第二个样例为例子,下标排列是这样子的

 /*
        * 0     6     12
        * 1   5 7  11 13
        * 2  4  8 10  14
        * 3     9
        * */

  

可以看出,除去斜边的,每一行都是一个等差数列,例如0,6,12

而斜边的是竖排中的数加上某一个固定值,例如第二行就是1+4=5,7+4=11

然后综合可以总结出规律,等差数列的差是numRows+numRows-2,即2*numRows-2,其实就是同一行相邻数字中隔的数字

然后每一行中间要加的固定值,是前面等差数列的差依次-2,因为每向下一行两个数间隔就少两个数,例如第二行固定值4,第三行固定值就是4-2=2

之后就是用代码实现了,相信也不难写了

if(numRows>s.length()||numRows==1)
            return s;
        int length = s.length();
        int count = numRows*2-2;
        int next = 0;
        String result = "";
        for(int i = 0;i < numRows;i++){
            for(int j = i;j < length;){
                result = result + s.charAt(j);
                next = j + count - 2 * i;
                if(i!=0&&i!=numRows-1&&next<length){
                    //第一行和最后一行竖排中的数加上固定值和这个数字在等差数列的下一个值相等
                    //所以这两行不管它
                    result = result + s.charAt(next);
                }
                j = j + count;
            }
        }
        return result;

  

这个还不是最优解,到时候看看还能不能优化

原文地址:https://www.cnblogs.com/Yintianhao/p/9864952.html

时间: 2024-11-10 14:11:37

[LeetCode] Z字型变换的相关文章

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 conver

【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] 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

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

Android基础入门教程——8.3.15 Paint API之——Typeface(字型)

Android基础入门教程--8.3.15 Paint API之--Typeface(字型) 标签(空格分隔): Android基础入门教程 本节引言: 本节带来Paint API系列的最后一个API,Typeface(字型),由字义,我们大概可以猜到,这个 API是用来设置字体以及字体风格的,使用起来也非常的简单!下面我们来学习下Typeface的一些相关 的用法!官方API文档:Typeface~ 1.字体的可选风格 四个整型常量: BOLD:加粗 ITALIC:斜体 BOLD_ITALIC

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: