zoukankan      html  css  js  c++  java
  • 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]的。

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

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

     
  • 相关阅读:
    php.ini中设置session过期时间
    IP(Internet Protocal) 地址 说明
    html年月日下拉联动菜单 年月日三下拉框联动
    使用数组的键值,做为变量名的方法
    html中js只允许输入数字
    阿里云服务器问题攻略
    小帆远行
    Android图片转换类 1. Bitmap去色,转换为黑白的灰度图, 2. Bitmap图片加圆角效果
    EditText禁止输入回车
    Android之系统自带的文字外观设置
  • 原文地址:https://www.cnblogs.com/goingmyway/p/4525609.html
Copyright © 2011-2022 走看看