最近打算开始每隔一天练一道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 之前的 A 存放到指定的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]的。
讲到这里,相信大家都明白了吧,很少写这种博客,还是初学者,有问题的话希望大家给点建议^_^,多多交流学习
相信大家还有更好的解法。我暂时就想到这种解法,最近智商比较捉急额>……<