leetcode6 Z字形变换 python
题目:
将字符串 "PAYPALISHIRING"
以Z字形排列成给定的行数:
P A H N A P L S I I G Y I R之后从左到右"PAHNAPLSIIGYIR" 实现一个将字符串进行指定行数变换的函数。
思路:
1. 官方答案版本1
以上面这个例子解释:
遍历原始字符串,用currow变量记录所处的行,即让currow变换为0,1,2,1,0,1,2,1,0,1,2,1,0,1......
(如果numRows是4行currow就是0,1,2,3,2,1,0,1,2,3,2,1...... )
同时初始化一个长度为3,元素为字符串的列表rows。
每到currow行,就把遍历到的字符s加入到rows相应元素,
如第0行,rows[0]+=s,第1行,rows[1]+=s ...... 最后再把rows按顺序输出就好了。
如何让currow按需变换,需要再有个变量godown 记录方向,到0或numRows-1 行的时候,godown变向,决定currow加一或者减一。
需要注意
①原字符串长度可能小于numRows,所以列表长度为min(numRows, len(s))
②遇到numRows = 1,直接return s。
class Solution:def convert(self, s, numRows):""":type s: str:type numRows: int:rtype: str"""if numRows == 1:return srows = ['']* min(numRows, len(s))godown = Falsecurrow = 0for c in s:rows[currow] += cif currow == 0 or currow == numRows-1:godown = not godownif godown:currow += 1else:currow -= 1return ''.join(rows)
2. 官方答案版本2
主要是找出数字索引与行列数的关系。
0 | 4 | 8 | 12 | |||
1 | 3 | 5 | 7 | 9 | 11 | 13 |
2 | 6 | 10 |
numRows有3行,完全有数字的列,间隔interval=4,(4=2*3-2)
第0行:0,4,8,12...... (从0开始间隔4)
第numRows-1行:2,6,10...... (从numRows-1开始间隔4)
第1行:1,5,9,13... 也是间隔4,然后3比1大2, 7比5大2,11比9大2... (行内间隔innergap=2)
0 | 6 | 12 | ||||
1 | 5 | 7 | 11 | 13 | ||
2 | 4 | 8 | 10 | |||
3 | 9 |
numRows=4,interval=2*4-2=6。第0行和最后一行规律同上。
主要看innergap的规律,5---1,2---4的和都是6(interval),我们想求的是5减1,4减2,即innergap = interval - 2*i(i是行序号)
这个方法好像比上一个慢,不知道是不是对字符串s的访问太跳跃的原因>.<
class Solution:def convert(self, s, numRows):""":type s: str:type numRows: int:rtype: str"""if numRows == 1:return sans = ''interval = 2*numRows -2ans += s[::interval] #第0行,第一个例子里的0,4,8for i in range(1, numRows-1): #第1到倒数第2行innergap = interval - 2*ifor j in range(i, len(s),interval):ans += s[j] #例子里的1,5,9if j + innergap < len(s): #注意越界ans += s[j+innergap] #例子里的3,7ans += s[numRows-1::interval] #最后1行,例子里的2,6return ans
发现, i、j循环里,j+innergap每次都要判断越界,稍微改进直到一行最后才判断,会变快^0^
for i in range(1, numRows-1): #第1---倒数第2行innergap = interval - 2*ij = iwhile j<len(s)-interval:ans +=(s[j]+s[j+innergap]) #while循环里先把1、3、5、7放进去j += intervalif j < len(s): #然后判断9是否越界ans += s[j]if j+innergap < len(s): #再判断11是否越界ans += s[j+innergap]
leetcode6 Z字形变换 python相关推荐
- leetcode6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...
- LeeTCode:6. Z 字形变换 python实现
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 方法一: 为一个 类似 ...
- LeetCode Algorithm 6. Z 字形变换
6. Z 字形变换 Ideas 这题的思路其实只要想到了就很简单,首先创建一个numRows行的矩阵,每一行用来存Z字变换后每一行的字符,然后遍历字符串s,其实就是从上往下然后从下往上填充到每一行,所 ...
- leetcode题库:6. Z字形变换
题目: /**题目:6. Z字形变换(题目地址:https://leetcode-cn.com/problems/zigzag-conversion/description/) * 将字符串 &qu ...
- Z 字形变换 C++实现 java实现 leetcode系列(六)
Z 字形变换 java实现 C++实现 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...
- java z+_Java Z 字形变换
– 题目:Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: ...
- 【LeetCode】6.Z 字形变换
6.Z 字形变换 我的思路貌似没有第二家,不过我懒得解释了. #include <string> #include <iostream> using namespace std ...
- [模拟|字符串] leetcode 6 Z字形变换
[模拟|字符串] leetcode 6 Z字形变换 1.题目 题目链接 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHI ...
- leetcode第六题Z字形变换心得记录
算法学习之路-坚持走下去 Z字形变换 题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行 ...
最新文章
- c语言大项目经验,C语言该学的地方(项目经验)
- 微信小程序多张图片和表单一起上传,验证表单及进度条的实现完整代码
- SQL Server占用服务器内存过高
- linux压缩和解压缩命令大全
- O(n* (logn)^2 )的Shell排序——转自Matrix67的博客
- 网站性能Web压力测试工具webbench
- matlab修改图片位深度_如何利用matlab统一处理照片亮度对比度
- Python常用运算符含义与用法演示
- python学习笔记(11)--测验3: Python基础语法(下) (第7周)
- mysql 并发_MySQL的并发控制与加锁分析
- JDBC——连接数据库
- 人工智能写作:想要和智能对话 本AI给你的写作指个路
- 天思ERP软件常见问题解决方案
- 个性化制作nodemcu-firmware(esp8266/esp8285 固件制作)----包含lua程序bin的制作
- 常见随机变量的数学期望和方差
- 教你如何快速下载网站?如何仿制网址,下载网站,获取网站html文件,图像文件
- 手机测试wifi的延迟的软件,六款最佳、免费的网络延迟测试工具
- 云游戏拉开产业化大幕
- Android拍照识别身份证SDK
- 大型软件设计——进度报告