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 字形变换的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-006-Z 字形变换

[LeetCode] Z字形变换

Z字形变换 leetcode 6

LeetCode 6. Z 字形变换

leetcode算法:6.Z 字形变换

leetcode 6: Z字形变换