zoukankan      html  css  js  c++  java
  • No.6 ZigZag Conversion

    No.6 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".

    注意:其实思路想到了,但不敢相信自己的想法,没有坚持下去,加油!

    方法一:时间复杂度O(n),空间复杂度O(1)

     1 class Solution
     2 {
     3 public:
     4     string convert(string s, int numRows)
     5     {//法一:找规律,计算数学表达式
     6     //参考:http://blog.csdn.net/linhuanmars/article/details/21145039
     7         if(s.size()==0 || numRows<=1 || s.size()<= numRows)//numRows=1是一种特殊情况,要单独考虑!!!
     8             return s;
     9         
    10         string result;
    11         int size = 2*numRows-2;//每个之字形是2*numRows-2个字符
    12         //对每一行,先把往下的那列的字符加进去,然后将向上的字符加进去
    13         for(int i=0; i<numRows; i++)//对于每一行
    14         {
    15             for(int j=i; j<s.size(); j+=size)
    16             {
    17                 result+=s[j];
    18                 if(i!=0 && i!= numRows-1 && j+size-2*i < s.size())//注意表达式的计算!!!
    19                     result += s[j+size-2*i];//对于非第一行和最后一行,加入向上的那个字符
    20             }
    21         }
    22         return result;
    23     }
    24 };
    25 int main()
    26 {
    27     Solution sol;
    28     cout << sol.convert("PAYPALISHIRING",3)<<endl;//应输出:"PAHNAPLSIIGYIR"
    29     cout << sol.convert("PAYPALISHIRING",4)<<endl;//应输出:"PINALSIGYAHRPI"
    30     return 0;
    31 }

    法二:时间复杂度O(n),空间复杂度O(n)

         其实更容易想到

     1 class Solution
     2 {
     3 public:
     4     string convert(string s, int numRows)
     5     {//法二:用辅助空间,按照规则将其存在numRows个string中
     6     //参考:https://github.com/haoel/leetcode/blob/master/algorithms/zigZagConversion/zigZagConversion.cpp
     7         if(s.size()==0 || numRows<=1 || s.size()<= numRows)//numRows=1是一种特殊情况,要单独考虑!!!
     8             return s;
     9         vector<string> r(numRows);//!!!
    10         int row = 0;//第几行
    11         int step = 1;//标识向上还是向下
    12         for(int i=0; i<s.size();i++)
    13         {
    14             if(row == numRows-1)//到达底部,反向
    15                 step = -1;
    16             if(row == 0)//到达顶部,反向
    17                 step = 1;
    18             r[row] += s[i];
    19             row += step;
    20         }
    21         string result;
    22         for(int i=0; i<numRows; i++)
    23             result += r[i];
    24         return result;
    25     }
    26 };
  • 相关阅读:
    Node post请求 通常配合ajax
    Node json
    Node params和query的Get请求传参
    Node express
    java NIO FileChannel
    IO 输出 PrintStream和PrintWriter
    ByteBuffer
    分析dump
    oracle free space
    SHELL 在指定行的前/后插入指定内容
  • 原文地址:https://www.cnblogs.com/dreamrun/p/4546578.html
Copyright © 2011-2022 走看看