LeetCode 6. Z 字形变换

6. Z 字形变换

题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L D R
E O E I I
E C I H N
T S G

知识点

  1. list的sort的使用,同时根据多个数据排序key=lambda x:(x[3],x[2])

解题

  1. 在字符串中的位置为s,在二维空间中的位置为(i-横坐标,j-纵坐标),左上角为(0,0)。对numRow=4,行走的坐标依次为(0, 0)-(0,1)-(0, 2)-(0, 3)-(1, 2)-(2, 1)-(3, 0)-(3, 1)-(3, 2)-(3, 3)-(4, 2)-(5, 1)-(6, 0)
  2. 规律为<u> i不变,j加至numRow,i+1, j-1, j减至0,重复</u>。这样就从s到(i,j)做了映射,dict("L"=(0,0),"E"=(0,1))..
  3. 读取的时候,直观想法是是从j=0的开始,i一直增加,如果有数就输出。但我觉得不是去判断是不是空格,而是把上面的dict的key,value交换(或者一上来就直接建立坐标到字母的映射),然后按照key进行排序(先排j,j相等的情况下对i排序),然后依次输出
  4. 简化一下,其实并不需要一个map(如果使用map,结构应该为dict(i=1,j=2,s='L'),然后放到list里面),只需要一个tuple的list就可以了
class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        all_words = []
        i = 0
        j = 0
        ss = 0
        if numRow <=1:
            return s
        while ss < len(s):
            while ss < len(s) and j < numRows - 1:
                all_words.append((i, j, s[ss]))
                j += 1
                ss += 1
            while ss < len(s) and j > 0:
                all_words.append((i, j, s[ss]))
                j -= 1
                i += 1
                ss += 1

        all_words.sort(key=lambda x: (x[1], x[0]))
        return "".join([w[2] for w in all_words])
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述: 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETC...
    LeeYunFeng阅读 970评论 0 50
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,446评论 0 2
  • 题目 将字符串 "PAYPALISHIRING"以Z字形排列成给定的行数: 之后从左往右,逐行读取字符:"PAHN...
    sxqiong阅读 1,314评论 0 1
  • 题目 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 示例:输入: s = "LEETC...
    会飞的蜗牛07阅读 171评论 0 1
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,926评论 0 10