zoukankan      html  css  js  c++  java
  • ZigZag Conversion

    题目:

    该字符串"PAYPALISHIRING"以一个Z字形模式写在给定行数上,如下所示:(您可能希望以固定字体显示此模式以获得更好的可读性),输入是string和纵向长度,即行数。

    输出就是PAHNAPLSIIGYIR

    我的方法:

    想法1:建立一个char类型的二维数组,char[i][j],i表示行长,为了使行长够长,让i=string的length;j是列长,列长必须等于输入的行数,然后就是输入,要注意按照z形式输入,当string中所有元素都输入完成后,再横向读出,就有了最后结果。

    public static String convert(String s, int numRows) {
            if(numRows == 1)
                return s;
            char[][] cs = new char[s.length()][numRows];
            boolean bool = true;
            int i=0, j=0;
            for(int n=0; n<s.length(); n++){//写入
                cs[i][j] = s.charAt(n);
                if(j == numRows-1){
                    bool = false;
                }else if(j == 0){
                    bool = true;
                }
                if(bool){
                    j++;
                    continue;
                }
                j--;
                i++;
            }
            String s1 = "";
            for(int p=0; p<numRows; p++){
                for(int q=0; q<s.length(); q++){
                    s1 = s1.trim() + cs[q][p];
                }
            }
            return s1.trim();
        }

    上述方法可行,但是时间超过限制

    想法2:设置一个string[rows],rows等于列长(即输入的那个行数),然后又因为当读到字符串的第n位时,应该放在第string[num]个字符串上,其中假设x=n%(2*rows-2),当x>(rows-1)时,num=rows-x。代码如下:

    但是还是时间复杂度过大。为了降低时间复杂度,应使用StringBuilder和append这两个函数,提高String的读写拼接速度,下边是对想法2的修改

    leetcode方法:

    下面两个是leetcode讨论区的方法:

    方法1:

    class Solution {
        public String convert(String s, int numRows) {
        if(numRows<=1)return s;
        StringBuilder[] sb=new StringBuilder[numRows];
        for(int i=0;i<sb.length;i++){
            sb[i]=new StringBuilder("");   //init every sb element **important step!!!!
        }
        int incre=1;
        int index=0;
        for(int i=0;i<s.length();i++){
            sb[index].append(s.charAt(i));
            if(index==0){incre=1;}
            if(index==numRows-1){incre=-1;}
            index+=incre;
        }
        String re="";
        for(int i=0;i<sb.length;i++){
            re+=sb[i];
        }
        return re.toString();
        }
    }

    方法2:

    public String convert(String s, int nRows) {
        char[] c = s.toCharArray();
        int len = c.length;
        StringBuffer[] sb = new StringBuffer[nRows];
        for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
        
        int i = 0;
        while (i < len) {
            for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
                sb[idx].append(c[i++]);
            for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
                sb[idx].append(c[i++]);
        }
        for (int idx = 1; idx < sb.length; idx++)
            sb[0].append(sb[idx]);
        return sb[0].toString();
    }
    

      

  • 相关阅读:
    最大子列和
    喷水装置
    某种排序
    三个水杯
    奇偶数分离
    ASCII码排序(未完)
    1002
    if语句
    6.7
    A+B问题 涉及EOF
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7726075.html
Copyright © 2011-2022 走看看