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]的。

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

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

 
时间: 2024-09-27 21:58:00

LeetCode ZigZag problem的相关文章

LeetCode——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: "PAHNAPLSII

LeetCode ZigZag Conversion(将字符串排成z字型)

1 class Solution { 2 public: 3 string convert(string s, int nRows) { 4 string a=""; 5 int len=s.length(); 6 if(len<=nRows||nRows==1) return s; //只有n个,不足一个周期||排成一行 7 int teams=len/(nRows*2-2); //teams个完整的周期 8 int rest=len%(nRows*2-2); //最后一个不足

LeetCode.ZigZag Conversion ,Container With Most Water

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 lin

LeetCode ZigZag Conversion C++ 解题思路

一个难度为Easy的题,看了好多人的题解都没想明白,最后使劲想使劲想,才想的差不多..太弱了,要找不到工作了.. 题目描述: 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

LeetCode ZigZag Conversion 解题报告

对输入字符串,做蛇形变化,然后按行输出. https://oj.leetcode.com/problems/zigzag-conversion/ 例如:The string "PAYPALISHIRING"  的蛇形变化如下: P        A           H        N A   P   L    S     I     I   G Y         I            R 最后要求输出的就是:"PAHNAPLSIIGYIR" Write

LeetCode 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: "PAHNAPLSII

Leetcode: Zigzag Iterator

Given two 1d vectors, implement an iterator to return their elements alternately. For example, given two 1d vectors: v1 = [1, 2] v2 = [3, 4, 5, 6] By calling next repeatedly until hasNext returns false, the order of elements returned by next should b

[LeetCode] ZigZag Conversion [9]

称号 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: "PAHNAPL

[LeetCode] ZigZag Converesion 之字型转换字符串

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: "PAHNAPLSII