LeetCode6.python实现:Z 字形变换问题☆☆
目录
问题
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为
"LEETCODEISHIRING"行数为 3 时,排列如下:
[code]L C I R E T O E S I I G E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:
"LCIRETOESIIGEDHN"。
请你实现这个将字符串进行指定行数变换的函数:
[code]string convert(string s, int numRows);
示例 1:
[code]输入: s = "LEETCODEISHIRING", numRows = 3 输出: "LCIRETOESIIGEDHN"
示例 2:
[code]输入: s = "LEETCODEISHIRING", numRows = 4 输出: "LDREOEIIECIHNTSG" 解释: L D R E O E I I E C I H N T S G
解题思路
分析:这是一个很有意思的题目,仔细分析问题,其实是一道找规律题。找到了规律,具体实现,问题就不大了。下面我们看常规情况的规律(指定行数n>=2)(特殊情况看详细步骤的说明):
1)一个统一的规律(第一行和最后一行除外):每行的下标差值的变化规律,只有两个数字在交叉进行,我们规定:当前行数为i,则第一个数字=2(n-i),第二个数字=2(i-1);
2)第一行和最后一行规律:这两行的规律一致,两个数字均为 2(n-1)(为了后续程序统一处理,所以也规定为两个数字。
规律的简单实例可参考下图和上述两条规律结合查看(比较乱):
因此,详细步骤文字描述如下:
1)特殊情况的处理:即指定行数n的值,若给定行数n值小于2,则直接返回给定字符串(包含了行数为0或是负数的情况)
2)常规情况的处理:根据分析,首先我们要先将规律情况,用一个嵌套列表来存储,方便后续字符的直接读取拼接;然后我们就可以根据存储的规律值,外层按行遍历(这里注意遍历的控制为:min(numRows,len(s)),读取每行存储给定字符串的哪些字符了;里层的遍历,用while来实现,因为每行的两个规律数值是交替出现的,因此需要设置一个变量来控制交替进行,即程序中的jiouCount变量,然后交替改变变量值即可,参看程序的交替实现过程;
3)遍历结束,返回结果值即可。
根据上述解题分析,代码如下:
python具体实现
[code]class Solution(object): def convert(self, s, numRows): """ :type s: str :type numRows: int :rtype: str """ if numRows<=1: #若给定行数小于2,则直接返回给定字符串(包含了行数为0或是负数的情况) return s zRule = [] # 存储每一行的字母读取变化规律 for i in range(numRows): if i ==0: # 第一行的特殊处理 zRule.append([2*(numRows-1),2*(numRows-1)]) elif i == numRows-1: zRule.append([2*(numRows-1),2*(numRows-1)]) else: zRule.append([2*(numRows-i-1),2*(i-0)]) # 最后一行的特殊处理 zShapeStr = '' # 存储结果值,默认空字符串 sLen = len(s) # 给定字符串的长度 for i in range(min(numRows,sLen)):# 注意第一层循环的次数控制:min(numRows,sLen) zShapeStr = zShapeStr + s[i] jiouCount = 0 # 对zRule中的列表值的下标0,1进行控制读取 j = i+zRule[i][0] # 默认准备读取的下一个字符的下标位置 while j<sLen: zShapeStr = zShapeStr+s[j] if jiouCount ==0: # 下一个字符的位置变化 j = j+zRule[i][1] jiouCount = 1 else: j = j+zRule[i][0] jiouCount = 0 return zShapeStr
题外记
这题第一眼看的时候,给人感觉不难但又无从下手的感觉,找准规律,是解题的关键。程序实现,从某种层面上说,是另一回事。
大概就是所谓的眼高手低吧!
需要注意的一点就是,行数遍历的控制:min(numRows,len(s).第一次提交失败,就栽在了这里!!!
突然发现这也是一种简单的加密方式哟。
- Z字形编排问题-Java实现
- leetcode 2. Add Two Numbers python实现的理解,结点,单链表的应用,大数,进位的问题
- 【LeetCode-面试算法经典-Java实现】【134-Gas Station(加油站问题)】
- 【LeetCode】之字形变换
- LeetCode33.python实现: 搜索旋转排序数组问题☆☆
- 【LeetCode-面试算法经典-Java实现】【063-Unique Paths II(唯一路径问题II)】
- Z 字形变换(LeetCode)
- LeetCode215. python实现:数组中的第K个最大元素问题☆☆
- LeetCode66.python实现: 加一问题☆
- LeetCode | 6. ZigZag Conversion(之字形变换)
- LeetCode 6 Z字形变换(字符串)
- 编程集训第7天:DP实战--0-1背包问题实现(自我实现)及Leetcode(132)Palindrome Partitioning II
- LeetCode14. python实现:最长公共前缀问题☆
- LeetCode16. python实现:最接近的三数之和问题☆☆
- LeetCode292.Python实现: Nim游戏问题☆
- LeetCode217.python实现: 存在重复元素问题☆
- leetcode 题解 || Implement strStr() 问题 (即 KMP 算法实现)
- LeetCode53.python实现: 最大子序和问题☆
- LeetCode Merge K Sorted Lists 问题和解答程序 C++ priority queue实现方法
- 【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】