ZigZag Conversion go语言实现

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".

思路:

解:


String to Integer (atoi)

题目描述


思路:

  • 行数为rows,周期为2*rows-2。
  • 遍历字串,打印各周期:行数以内赋给各行,行数内对round-rows行字串赋值。

解:

package main

import "fmt"

func convert(s string, numRows int) string {
    if numRows == 1{
        return s
    }

    sSlice := []rune(s)
    rows := make([]string,numRows)
    for idx,_ := range rows{
        rows[idx] = ""
    }
    round := 2*len(rows)-2
    for i:=0;i<len(sSlice);i++{
        rem := i%round
        if rem< len(rows) {
            rows[rem] += string(sSlice[i])
        }else {
            rows[round-rem] += string(sSlice[i])
        }
    }
    res := ""
    for _,elem := range rows{
        res += elem
    }
    return res
}

func main()  {
    //s := "PAYPALISHIRING"
    res := convert("A",2)
    fmt.Print(res)
}

思路2:

  • Z型串打印,可以非递归实现,不用“尾递归”。
  • rowsIdx和strIdx递增打印。打印到rowsIdx==len(rows),再向上打印完这个周期(注意此过程打印完字串则程序结束)。

细节:

  • 会用到HERE:跳转。

解:

import "fmt"

func convert(s string, numRows int) string {
    if numRows == 1{
        return s
    }

    sSlice := []rune(s)
    rows := make([]string,numRows)
    for idx,_ := range rows{
        rows[idx] = ""
    }

    for i,ri:=0,0;i<len(sSlice);{
        if ri == len(rows) {
            for j := ri-2;j>0;j--{
                rows[j] += string(sSlice[i])
                i++
                if i == len(sSlice){
                    goto HERE
                }
            }
            ri = 0
        }
        rows[ri] += string(sSlice[i])
        ri++
        i++
    }
    HERE:
    res := ""
    for _,elem := range rows{
        res += elem
    }
    return res
}

func main()  {
    s := "PAYPALISHIRING"
    res := convert(s,3)
    fmt.Print(res)
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近正在找实习,发现自己的算法实在是不能再渣渣,在网上查了一下,发现大家都在刷leetcode的题,于是乎本渣渣也...
    caoxian阅读 927评论 0 2
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,941评论 2 36
  • 对 hard 类型的题,表示目前实在是 hold 不住,暂时先不刷啊。等我刷完 easy 和 medium 回头再...
    秋名山菜车手阅读 303评论 0 0
  • 明媚的阳光从窗口倾泻进来,柔和的音乐缓缓流淌,我坐在舞蹈教室里,看着眼前久违的场景忽然觉得挺幸福。 本来是领着土豆...
    王小唐阅读 231评论 0 0
  • 题记:这是一个值得纪念的时刻 丑陋的躯体张牙舞抓盛开着多少欲望的花朵我要离你而去把它撕碎在云朵里 奔腾的神经还有那...
    郭安安阅读 281评论 9 23