ZigZag Conversion

原创 2015年11月18日 21:00:54

题目描述

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)
图片
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”.

题目解答

解题思路

  • 通过一个数组来保存每一行的内容,一个指针step来控制上下的移动
  • 通过数学规律来解决, l两两对
    参考博客
    图片2
    可以发现规律,画红色的长度永远是 2n-2 (想法是你试想把所有这些行压缩成两列,两边手挤一下,第二列永远的第一行和最后一行少字)。

    利用这个规律,可以按行填字,第一行和最后一行,就是按照2n-2的顺序一点点加的。

    其他行除了上面那个填字规则,就是还要处理斜着那条线的字,可以发现那条线的字的位置永远是当前列j+(2n-2)-2i(i是行的index)。

代码实现
public class Solution {
    public String convert(String s, int numRows) {
        if(s == null || s.length() == 0 || numRows == 0)
            return "";
        if(numRows == 1)
            return s;
         //存储每一行的内容
        StringBuilder[] rowContent = new StringBuilder[numRows];
        for(int i = 0; i < numRows; i++)
            rowContent[i] = new StringBuilder();

        int pos = 0;
        int step = 0;
        for(int i = 0; i < s.length(); i++){
            //step控制上下移动
            if(pos == (numRows-1))
                step = - 1;
            if(pos == 0)
                step = 1;
            rowContent[pos].append(s.charAt(i));
            pos += step;
        }

        StringBuilder ret = new StringBuilder();
        for(int i = 0; i < numRows; i++)
            ret.append(rowContent[i]);
        return ret.toString();
    }
}

规律

/**
     * 通过数学规律来解决
     *可以发现规律,一个来回的长度永远是 2n-2
     利用这个规律,可以按行填字,第一行和最后一行,就是按照2n-2的顺序一点点加的。
     其他行除了上面那个填字规则,就是还要处理斜着那条线的字,
     可以发现那条线的字的位置永远是当前列j+(2n-2)-2i(i是行的index)--两两配对
     */
    public String convert2(String s, int numRows){

        if(s == null || s.length() == 0 || numRows == 0)
            return "";

        if(numRows == 1)
            return s;

        int strLen = s.length();
        int size = 2*numRows - 2;
        StringBuilder ret = new StringBuilder();
        for(int i = 0; i < numRows; i++){
            for(int j = i; j < strLen; j += size){
                ret.append(s.charAt(j));
                if(i != 0 && i != (numRows-1)){
                    int temp = j + size - 2*i;
                    if(temp < strLen)
                        ret.append(s.charAt(temp));
                }
            }
        }
        return ret.toString();
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

Leetcode_6_ZigZag Conversion

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41408021 看完这篇文章,你可能会学到到知识如下: ...
  • pistolove
  • pistolove
  • 2014年11月23日 09:45
  • 2566

ZigZag Conversion (C实现)

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you...
  • u014056175
  • u014056175
  • 2015年09月08日 14:40
  • 321

[LeetCode] 006. ZigZag Conversion (Easy) (C++/Java/Python)

[LeetCode] 006. ZigZag Conversion (Easy) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015年02月28日 00:13
  • 2367

[Leetcode]6. ZigZag Conversion @python

题目The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (y...
  • qian2729
  • qian2729
  • 2016年01月13日 00:32
  • 712

LeetCode::Zigzag Conversion C语言

题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this...
  • u013300875
  • u013300875
  • 2015年03月07日 22:36
  • 1162

LeetCode-6. ZigZag Conversion (JAVA)(之字形转换)

LeetCode-6. ZigZag Conversion (JAVA)(之字形转换)
  • mine_song
  • mine_song
  • 2017年04月17日 09:41
  • 203

leetcode 6 ZigZag Conversion C++

这道题最大的难点在理解题意。。。 它是一个折线图样子的。 string convert(string s, int numRows) { string result = ""; ...
  • a2331046
  • a2331046
  • 2016年06月28日 10:52
  • 187

【LeetCode】ZigZag Conversion 解题报告

【题目】 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like th...
  • ljiabin
  • ljiabin
  • 2014年10月26日 16:49
  • 22446

LeetCode 6 ZigZag Conversion (C,C++,Java,Python)

Problem: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l...
  • runningtortoises
  • runningtortoises
  • 2015年05月06日 22:55
  • 1071

数学技巧 ZigZag Conversion

思想: 关键是归纳出元素出现位置的公式。 比如 nRows =4 的情形需要下面这样的分布: 第0行:0 + + 6  +  + 12 第1行:1 + 5 7 +  11  第2行:2 4 ...
  • yeruby
  • yeruby
  • 2015年04月14日 21:17
  • 487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZigZag Conversion
举报原因:
原因补充:

(最多只允许输入30个字)