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问题的一种新思路

为一个简单的字符串转换提供了一种基于图深度优先遍历的方法,是一种新的思路。ZigZag Conversion,原题链接:https://leetcode.com/problems/zigzag-con...
  • tonywearme
  • tonywearme
  • 2015年08月17日 09:17
  • 2028

【python】【leetcode】【算法题目6—ZigZag Conversion】

【python】【leetcode】【算法题目6—ZigZag Conversion】 题目原文: The string "PAYPALISHIRING" is written in a zigzag...
  • u014615155
  • u014615155
  • 2016年11月26日 15:44
  • 383

【leetcode】第6题:ZigZag

今天看了下Leetcode上难度为easy的题目,看了下,确实很简单,但是!!!由于我的java实在太差,卡在输出上长达半个小时,真是醉了醉了。现在才意识到java基础还是很重要啊!!! 题目如下图所...
  • Apolo_
  • Apolo_
  • 2016年03月05日 10:00
  • 163

leetcode 题解代码整理 6-10题

ZigZag Conversion The string "PAYPALISHIRING" is written in a zigzag pattern on a giv...
  • u011932355
  • u011932355
  • 2015年08月05日 15:11
  • 825

[LeetCode]62 不同的路径总数

Unique Paths(不同的路径总数)【难度:Medium】 A robot is located at the top-left corner of a m x n grid (marked ...
  • qq_14821023
  • qq_14821023
  • 2016年02月28日 13:31
  • 671

第6题 ZigZag转换

题目描述如下: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like...
  • wuchao0508
  • wuchao0508
  • 2016年10月25日 10:51
  • 80

LeetCode刷题指南(一)

以下是我个人做题过程中的一些体会: 1. LeetCode的题库越来越大,截止到目前,已经有321个问题了。对于大多数人来说,没有时间也没有必要把所有题目都做一遍(时间充裕可以随意)。刷个100题左...
  • Lnho2015
  • Lnho2015
  • 2016年03月23日 15:02
  • 38188

leetcode刷题经验

语言不是最重要的,思想最重要从做上面的题,我发现我更擅长一些数学技巧不高的程序题,习惯靠直觉立马书写代码,而非严格推理之后,再书写代码对于链表的题比较擅长,链表可以在纸上画画,关键要考虑的问题,就是链...
  • basycia
  • basycia
  • 2016年02月28日 15:31
  • 1375

简单的leetcode题(四)

Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be w...
  • mjw110420117
  • mjw110420117
  • 2016年04月15日 00:30
  • 579

[LeetCode刷题笔记] 关于LeetCode的前言

又到了一年毕业就业季了,三年前的校招季我逃避了,可这一次终于还是要轮到我了=_=||。 作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢? LeetCode收录了许多互联网...
  • tostq
  • tostq
  • 2016年07月22日 21:32
  • 2992
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 第6题 ZIGZAG后,行列输出
举报原因:
原因补充:

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