题目
将一个给定字符串 s
根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING"
行数为 3
时,排列如下:
1 | P A H N |
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
。
请你实现这个将字符串进行指定行数变换的函数:
1 | string convert(string s, int numRows); |
示例 1:
1 | 输入:s = "PAYPALISHIRING", numRows = 3 |
示例 2:
1 | 输入:s = "PAYPALISHIRING", numRows = 4 |
示例 3:
1 | 输入:s = "A", numRows = 1 |
提示:
1 <= s.length <= 1000
s
由英文字母(小写和大写)、','
和'.'
组成1 <= numRows <= 1000
简介
1 | 重点不在字形,重点在变换是什么变换 |
正文
我们思考,为什么这个算法难写
分析 N字形
的离散函数,我们面临着一个唯一的 x
对应着 1- N 个 y
在 x
变化的时候,我们首先要算该 x
对应了几个 y
这根本不符合函数的定义函数是指一个集合中的每个元素都有且仅有一个映射到另一个集合中的元素,这种关系被称为函数映射
推出我们需要把一个一维度线性离线函数 s = f(n) 变成二维离散函数 s = g(x, y)
注意,这里好玩的是 y 和 x 其实是数列
即 s = g(x(n), y(n))
我们开始推导
1 | x(n) = x(n-1) + 1 |
1 | class Solution { |