LeetCode刷题-2: Z 字形变换
Posted il_持之以恒_li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题-2: Z 字形变换相关的知识,希望对你有一定的参考价值。
原题目如下:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、’,’ 和 ‘.’ 组成
1 <= numRows <= 1000
分析:
仔细看上述图片中的数字,你会发现一个如下规律:(下面s代表字符串,numRows代表行数)
1.第一行和最后一行上的相近两数之差为:2*numRows-2
2.中间斜杠上的数字x的值等于左边最靠近它竖杠上最底端的值x1减去与x1在同一竖杠上且与x同行的值x2再减1的2倍再加2,公式为:x=x2+(x1-x2-1)*2+2=2x1-x2
参考代码如下:
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
n = len(s)
if numRows==1 or numRows>=n:
return s
k = 2*numRows-2
str1 = ''
for i in range(numRows):
j = i+1
if j ==1 or j==numRows:
jk = j
while jk<=n:
str1+=s[jk-1]
jk+=k
else:
l = j
d = numRows
str1+=s[l-1]
while l<=n:
num1 = d-l-1
jk = l+2*num1+2
if jk<=n:
str1+=s[jk-1]
l += k
d += k
if l<=n:
str1+=s[l-1]
return str1
A = Solution()
print(A.convert('PAYPALISHIRING',1000))
public class Test3
public String convert(String s, int numRows)
int n = s.length();
if(numRows==1 || numRows>=n)
return s;
int k = 2*numRows-2;
StringBuilder sb = new StringBuilder();
for(int i=0;i<numRows;i++)
int j = i+1;
if(j==1 || j==numRows)
int jk = j;
while(jk<=n)
sb.append(s.charAt(jk-1));
jk+=k;
else
int l = j;
int d = numRows;
sb.append(s.charAt(l-1));
while(l<=n)
int num1 = d-l-1;
int jk = l+2*num1+2;
if(jk<=n)
sb.append(s.charAt(jk-1));
l = l+k;
d = d+k;
if(l<=n)
sb.append(s.charAt(l-1));
return sb.toString();
以上是关于LeetCode刷题-2: Z 字形变换的主要内容,如果未能解决你的问题,请参考以下文章