zoukankan      html  css  js  c++  java
  • LeetCode 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".


    自己一上来没搞懂什么是zigzag,还以为就是多了个中点,结果怎么都不对,搞得相当复杂,权且贴上代码,当个教训吧:

     1 public class ZigzagConversion {
     2     public static String convert(String s, int numRows) {
     3         if (s == null || s.length() == 0)
     4             return s;
     5         if (numRows < 2)
     6             return s;
     7         int gap = numRows - 2;
     8         String res = "";
     9 
    10         for (int i = 0; i < numRows; i++) {
    11             if (i == 0) {
    12                 for (int j = i; j < s.length(); j += (numRows * 2 - 2))
    13                     res += s.charAt(j);
    14             } else if (i == numRows - 1) {
    15                 for (int j = i; j < s.length(); j += (numRows * 2 - 2))
    16                     res += s.charAt(j);
    17             } else {
    18                 for (int j = i; j < s.length(); j += (numRows * 2 - 2)) {
    19                     res += s.charAt(j);
    20                     if (j + numRows * 2 - 3 - i < s.length())
    21                         res += s.charAt(j + numRows * 2 - 3 - i);
    22                 }
    23             }
    24         }
    25 
    26         return res;
    27     }
    28 
    29     public static void main(String[] args) {
    30         String s = "ABCDE";
    31         String res = convert(s, 4);
    32         System.out.println(res);
    33     }
    34 
    35 }

    问题代码,边界问题没有解决好

     1 public class Solution {
     2     public String convert(String s, int nRows) {
     3         if (s == null || s.length() <= nRows || nRows <= 1) return s;
     4         StringBuffer sb = new StringBuffer();
     5         // the first row
     6         for (int i = 0; i < s.length(); i += (nRows - 1) * 2) {
     7             sb.append(s.charAt(i));
     8         }
     9         
    10         for (int i = 1; i < nRows - 1; i++) {
    11             for (int j = i; j < s.length(); j+= (nRows - 1) * 2) {
    12                 sb.append(s.charAt(j));
    13                 if (j + (nRows - i - 1) * 2 < s.length()) {
    14                     sb.append(s.charAt(j + (nRows - i - 1) * 2));
    15                 }
    16             }
    17         }
    18         // the last row
    19         for (int i = nRows - 1; i < s.length(); i += (nRows - 1) * 2) {
    20             sb.append(s.charAt(i));
    21         }
    22         return sb.toString();
    23     }
    24 }

    后来百度了下,看到别人代码相当简洁,方知自己压根就没搞懂题目。

    Zigzag:即循环对角线结构(

    0       8       16      
    1     7 9     15 17      
    2   6   10   14   18      
    3 5     11 13     19      
    4       12       20      

    构建n个字符串,循环为每个分别添加相应的字符,最后合并所有字符;

    自己照着思路重新写了下:

     1 public class ZigzagConversion {
     2     public static String convert(String s, int numRows) {
     3         if (s == null || s.length() == 0)
     4             return s;
     5         if (numRows < 2)
     6             return s;
     7         String[] res = new String[numRows];
     8         String result = "";
     9         
    10         int i = 0, j;
    11 
    12         while (i < s.length()) {
    13             for (j = 0; j < numRows && i < s.length(); j++) {
    14                 res[j] += s.charAt(i);
    15                 i++;
    16             }
    17             for (j = numRows - 2; j > 0 && i < s.length(); j--) {
    18                 res[j] += s.charAt(i);
    19                 i++;
    20             }
    21         }
    22         for(int k = 0; k < numRows;k++)
    23             result += res[k];
    24         return result;
    25     }
    26 
    27     public static void main(String[] args) {
    28         String s = "PAYPALISHIRING";
    29         String res = convert(s, 3);
    30         System.out.println(res);
    31     }
    32 }

    只是没次字符串数组都默认初始化为null,如何覆盖还没解决,原文用C++代码如下:

     1 string convert(string s, int nRows){
     2     if(nRows == 1) return s;
     3     string res[nRows];
     4     int i = 0, j, gap = nRows-2;
     5     while(i < s.size()){
     6         for(j = 0; i < s.size() && j < nRows; ++j) res[j] += s[i++];
     7         for(j = gap; i < s.size() && j > 0; --j) res[j] += s[i++];
     8     }
     9     string str = "";
    10     for(i = 0; i < nRows; ++i)
    11         str += res[i];
    12     return str;
    13 }

    发现自己一些问题:首先是不能很好的思考问题,或者说自己的思路多少总会有些偏差;其次就是边界问题,总是犯些小错误。

  • 相关阅读:
    算法导论--第七章、快速排序
    PS操作
    【字符编码】彻底理解字符编码
    HTML网页设计-代码效果记录
    Ubuntu 18.04 nvidia driver 390.48 安装 TensorFlow 1.12.0 和 PyTorch 1.0.0 详细教程
    cmake更新版本简记
    计算机图形学(二)——微表面模型
    计算机图形学(一)——辐照度学概述
    蒙特卡洛积分与重要性采样详解
    for循环提高内存访问效率的做法
  • 原文地址:https://www.cnblogs.com/myshuangwaiwai/p/4483004.html
Copyright © 2011-2022 走看看