Leetcode 第6题 ZIGZAG后,行列输出

原创 2015年11月19日 22:12:07

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输出至矩阵内,再从矩阵内按行列输出(去掉空字符)

class Solution {
public:
string convert(string s, int numRows) {
if (s.length() == 0 || numRows == 1)
{
return s;
}
int fag = 2*numRows -2;
char** flag = new char*[numRows];
int tempClum = (s.length() / (numRows * 2 - 2) + 1 )* (numRows - 1) + 2;
for (int i = 0 ; i < numRows; ++i)
{
flag[i] = new char[tempClum];
for (int k = 0; k < tempClum; ++k)
{
flag[i][k] = '\0';
}
}

//按照ZIGZAG输出至矩阵内
int leng = s.length();
for(int i = 0; i < s.length() / (numRows * 2 - 2) + 1; ++i) //有多少次递归
{
int rows = 0;
int clum = i  * (numRows -1);
int j = 0;
for(;j < numRows ; ++j) //第一个处理,从上倒下
{
if (i * (numRows*2 - 2) + j >= s.length())
break;

flag[rows][clum] = s[i * (numRows*2 - 2) + j];
++rows;
}
for (rows = numRows - 2; rows > 0; --rows)  //斜线处理
{
if (i * (numRows*2 - 2) + j >= s.length())
break;
clum++;
flag[rows][clum] = s[i * (numRows*2 - 2) + j];
j++;
}
}

//从矩阵中输出
string temp;
for (int i = 0 ; i < numRows; ++i)
{
for (int k = 0; k < tempClum; ++k)
{
if (flag[i][k] != '\0')
{
string temp1;
temp1 = flag[i][k];
temp.append(temp1);
}
}
}
delete []flag;
return temp;
}
};


最主要的思路是要找到ZIGZAG的递归规律,准确的分出每一个递归距离。该题的递归距离是2*rows - 2;

在网上发现一个非常简洁的版本http://blog.csdn.net/cshaxu/article/details/12507201

  1. class Solution {  
  2. public:  
  3.     string convert(string s, int nRows) {  
  4.         // Start typing your C/C++ solution below  
  5.         // DO NOT write int main() function  
  6.         string result;  
  7.         if (nRows < 2) return s;  
  8.         for (int i = 0;i < nRows;++i) {  
  9.             for (int j = i;j < s.length();j += 2 * (nRows - 1)) {  
  10.                 result.push_back(s[j]);  
  11.                 if (i > 0 && i < nRows - 1) {  
  12.                     if (j + 2 * (nRows - i - 1) < s.length())  
  13.                         result.push_back(s[j + 2 * (nRows - i - 1)]);  
  14.                 }  
  15.             }  
  16.         }  
  17.         return result;  
  18.     }  
  19. };  
思路是

(1)如果当前给出的行只有1行,那么直接输出

(2)如果当前行是第0行或者是第NROW-1,那么相差为2*NROWS - 2;

(3)如果当前行不是第0行或者是第NROW-1,那么相差为2*NROWS - 2 中间还会穿插一个距离为

2*(NROWS - 2 - i)。

相关文章推荐

【leetcode】第6题 ZigZag Conversion 题目+解析+代码

【题目】 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this:...
  • buppt
  • buppt
  • 2017年08月09日 11:29
  • 75

leetcode第6题——*ZigZag Conversion

题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this...
  • buptlrw
  • buptlrw
  • 2015年12月31日 10:18
  • 297

【LeetCode】LeetCode——第6题:ZigZag Conversion

【LeetCode】LeetCode——第6题:ZigZag Conversion

[LeetCode-6]ZigZag字符串的变换输出

在LeetCode的第六个算法问题中,要求给定行数numRows,将一个字符串转变为ZigZag字符串再逐行读出。 ZigZag字符串即由常规字符串通过Z字形排列形成。 举个例子,Mathemat...

LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。

ZigZag Conversion   The string "PAYPALISHIRING" is written in a zigzag pattern on a given number o...

LeetCode刷题(C++)——ZigZag Conversion(Medium)

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

和大神们学习每天一题(leetcode)-ZigZag Conversion

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

leetcode第六题 ZigZag Conversion (java)

ZigZag Conversion The string "PAYPALISHIRING" is written in a zigzag pattern on a given number ...

关于LeetCode中ZigZag Conversion一题的理解

题目如下: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like t...

leetcode 第六题 ZigZag Conversion

从现在开始要一天一道leetcode了,不然感觉根本做不完的样子,说说最近做这几道题的感受吧,其实我真的是从小白开始做起的,刚开始的第一题都要看着答案做,然后慢慢地开始学会独立思考思考应该怎么解决问题...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 第6题 ZIGZAG后,行列输出
举报原因:
原因补充:

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