将字符串 "PAYPALISHIRING" 以 Z 字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y I R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释: P I N
A L S I G
Y A H R
P I
leetcode上的一道题,一开始看到这个题目,很耿直的就直接做了:  很好的对应刘每一个空格。。
def convert(s,num):
chushu=num*2-2
base=1+num-2
if chushu==0:
return s
yushu=len(s)%chushu
if yushu==0:
lieshu = len(s) / chushu * base
elif yushu<=num:
lieshu=len(s)/chushu*base+1
elif yushu> num:
lieshu = len(s) / chushu * base + yushu-num+1
newdata=[['' for j in range(num)] for i in range(lieshu)]
k=0
for i in range(lieshu):
for j in range(num):
if k<len(s):
if i%(num-1)==0 or (i+j)%(num-1)==0:
newdata[i][j]=s[k]
k+=1
# print newdata
a=[]
for j in range(num):
a.extend([i[j] for i in newdata if i[j]!=''])
return ''.join(a)
if __name__ == '__main__':
s='PAYPALISHIRING'
res= convert(s,4)
print res

结果是:

[['P', 'A', 'Y', 'P'], ['', '', 'A', ''], ['', 'L', '', ''], ['I', 'S', 'H', 'I'], ['', '', 'R', ''], ['', 'I', '', ''], ['N', 'G', '', '']]
PINALSIGYAHRPI

当然对是没问题的,就是效率比较低。

这道题有个技巧就是不需要管空格,因为他是按行打印的,P I N,无论你中间隔多少,都是这几个字母,然后再搞清楚他的排列方式,一会向下一会向上的。

def convert3(s,num):
chushu = num * 2 - 2
base = 1 + num - 2
if chushu == 0:
return s
newdata=[[] for i in range(num)]
c=0
direc=1 #方向
for i in s:
newdata[c].append(i)
if c>=num-1:
direc=-1
elif direc==-1 and c==0:
direc=1
c+=direc
print newdata
return ''.join([''.join(i) for i in newdata])
if __name__ == '__main__':
s='PAYPALISHIRING'
res= convert3(s,4)
print res

结果是:

[['P', 'I', 'N'], ['A', 'L', 'S', 'I', 'G'], ['Y', 'A', 'H', 'R'], ['P', 'I']]
PINALSIGYAHRPI

Z字形变换的更多相关文章

  1. C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. Leetcode题库——6.Z字形变换

    @author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...

  3. LeetCode Golang 6. Z 字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  4. Z 字形变换 C++实现 java实现 leetcode系列(六)

    Z 字形变换  java实现 C++实现  将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...

  5. Leetcode(6)Z字形变换

    Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  6. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  7. leetcode刷题六<z字形变换>

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...

  8. [Swift]LeetCode6. Z字形变换 | ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  9. [LeetCode] 6. Z 字形变换

    题目链接:(https://leetcode-cn.com/problems/zigzag-conversion/) 题目描述: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列 ...

  10. Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

随机推荐

  1. 【题解】 Codeforces 662A Gambling Nim (线性基)

    662A,戳我戳我 Solution: 我们先取\(ans=a[1] \bigoplus a[2] \bigoplus ... \bigoplus a[n]\),然后我们定义\(c[i]=a[i] \ ...

  2. 【字符串算法1】 再谈字符串Hash(优雅的暴力)

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...

  3. 洛谷 P2607 [ZJOI2008]骑士 解题报告

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  4. 扩展中国剩余定理学习笔记+模板(洛谷P4777)

    题目链接: 洛谷 题目大意:求同余方程组 $x\equiv b_i(mod\ a_i)$ 的最小正整数解. $1\leq n\leq 10^5,1\leq a_i\leq 10^{12},0\leq ...

  5. alpine编译安装tengine,并使用supervisor启动

    Alpine是一个小型的linux系统,官方docker镜像只有不到5MB,非常适合作为容器镜像. Alpine Linux is a security-oriented, lightweight L ...

  6. 51nod 1479 小Y的数论题

    一脸不可做题~~~233333 T<=100000,所以一定要logn出解啦. 但是完全没有头绪*&#……%*&……()……#¥*#@ 题解: 因为2^p+2^p=2^(p+1) ...

  7. [学习笔记]插头dp

    基于连通性的状压dp 巧妙之处:插头已经可以表示内部所有状态了. 就是讨论麻烦一些. 简介 转移方法:逐格转移,分类讨论 记录状态方法:最小表示法(每次要重新编号,对于一类没用“回路路径”之类的题,可 ...

  8. 界面编程之QT窗口系统20180726

    /*******************************************************************************************/ 一.坐标系统 ...

  9. linux command ------ unlink 和 rm 的区别

    unlink 不能用于删除文件夹,rm 可以删除文件和文件夹 当删除文件时,rm 和 unlink 是完全一样的.

  10. tp3 链接生成二维码

    https://packagist.org/packages/endroid/qr-code