• 6. ZigZag Conversion


    题目:

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

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

    And then read line by line: "PAHNAPLSIIGYIR"

    Write the code that will take a string and make this conversion given a number of rows:

    string convert(string text, int nRows);

    convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

    代码:

    看了半天,都没怎看懂题目。查了一下,原来:

    Zigzag:即循环对角线结构(

    0       8       16      
    1     7 9     15 17      
    2   6   10   14   18      
    3 5     11 13     19      
    4       12       20      

    这样子的话,就不算麻烦了,只要正确的字符串操作,把每个元素加在正确的位置就好。

    于是,共有numRows行,所以定义一个保护numRows元素的数组,用来保存每一行的字符串。

    观察规律,第一列从0写到numRows-1,之后从后往前,及numRows-2到0开始逐渐添加。输出并不需要考虑宽度,所以对字符串来说,之后往后加就好

    //凑了半天,总算凑出来了

    def convert(self, s, numRows):
            """
            :type s: str
            :type numRows: int
            :rtype: str
            """
            i = 0
            j = 0
            gap = numRows-2
            temp= ['' for x in range(numRows)]
            while i<len(s):
                while(j<numRows):
                    if(i>=len(s)):break
                    temp[j] += str(s[i])
                    j += 1
                    i += 1
                j=gap
                while(j>0):
                    if(i>=len(s)):break
                    temp[j] += str(s[i])
                    j -= 1
                    i += 1
            result = ''
            for y in temp:result += y

            return result    

    //网上查的,好像更直观   
        def convert2(self, s, nRows):
            if nRows==1: return s
            tmp=['' for i in range(nRows)]
            index=-1; step=1
            for i in range(len(s)):
                index+=step
                if index==nRows:
                    index-=2; step=-1
                elif index==-1:
                    index=1; step=1
                tmp[index]+=str(s[i])
            return ''.join(tmp)

    测试了多次,两个速度差不多,必定时间复杂度和空间复杂度都一样:

  • 相关阅读:
    【C++标准库】C++11新特性
    使用线程池
    Halcon相机硬触发采集图片
    C#之线程同步
    多线程之异常处理
    java基础 Arrays
    java基础 static关键字
    java基础 String
    c# 更新web.config
    java 基础
  • 原文地址:https://www.cnblogs.com/yuanzhaoyi/p/5952517.html
Copyright © 2020-2023  润新知