LeetCode ZigZag problem

最近打算开始每隔一天练一道leetcode(虽然对我来说有点难,但是希望能坚持下去^_^),自己的编程语言基础还不扎实,遇到磕磕碰碰,几天做了一道leetcode比较简单的题目,把我的解题思想分享给大家,顺便附上代码。

问题如下:

问题链接:https://leetcode.com/problems/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".

 

我的解题思想如下:

1.首先,对于字符串"PAYPALISHIRING",我可不可以先读取如下结果的每一行,然后最后拼接起来呢?答案是肯定的。

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

比如,建立一个string数组,如string[numRows],然后,把第一行的P A H N放到string[0],第二行的A P L S I I G的放到string[1],然后把第三行的A P L S I I G放到string[2]。最后一次读取拼接到一个string中。

 

2.那问题来了?怎么按照题目要求的逻辑读取第一行、第二行和第三行呢?

我们先不考虑读取一行的问题,我们先考虑读取一个字符,比如,把结果中的第二行A P L S I I G中的字符 P 存放到指定的strlist[j]呢?我们继续看。

要把第二行A P L S I I G中的字符 P 存放到指定的strlist[j],就必须先把字符 P 之前的 存放到指定的strlist[j],那怎么做呢?

我们看以下C++的代码:

 1 class Solution {
 2 public:
 3     string convert(string s, int numRows) {
 4         if (numRows == 1)
 5             return s;
 6         int i=0, j=0;
 7         string result = "";
 8         string strlist[numRows];
 9         bool flag = false;
10         for(i=0;i<s.length();i++)
11         {
12             strlist[j] += s[i];//同一行的字符进行拼接
13                 if(!flag)
14                     j++;
15                 else
16                     j--;
17                 if(j%(numRows-1) == 0)
18                     flag = !flag;    
19         }
20         for (i = 0; i < numRows; i++) result += strlist[i];
21         return result;
22     }
23 };

下面就详细介绍该部分代码吧:

string strlist[numRows];

这行代码表示把每一行的结果存到一个string类型的数组中去。

下面的代码是程序的主逻辑:

 1 bool flag = false;
 2 for(i=0;i<s.length();i++)
 3 {
 4     strlist[j] += s[i];//同一行的字符进行拼接
 5     if(!flag)
 6         j++;
 7     else
 8         j--;
 9     if(j%(numRows-1) == 0)
10         flag = !flag;    
11 }

这段代码的意思是程序依次读取要处理的字符串的每一个字符,并把该字符s[i]按顺序存到指定的strlist[j]中去。这里的strlist[j]中的变量j的范围是从0到numRows-1的,因为题目要求把字符串分成numRows行。

那为什么需要一个flag呢?下面详细解释为什么需要一个flag。

这个for循环刚开始运行的时候,是把字符串 "PAYPALISHIRING"中的前三个字符 P A Y 分别存放到了strlist[0],strlist[1],strlist[2]这三个string的第一个字符的位置,如果numRows是3,那么逻辑上第4个字符 P 应该存到strlist[1]中的,怎么控制字符串"PAYPALISHIRING"中第3个字符之后的字符依次存到相应的strlist[j]中呢?因此,flag的作用就是为了控制后续的字符存到相应的strlist[j]的。

 

讲到这里,相信大家都明白了吧,很少写这种博客,还是初学者,有问题的话希望大家给点建议^_^,多多交流学习

相信大家还有更好的解法。我暂时就想到这种解法,最近智商比较捉急额>……<

 
posted @ 2015-05-24 11:55  GoingMyWay  阅读(594)  评论(2编辑  收藏  举报