6.Z字形变换

2018-12-06  本文已影响0人  夜空中最亮的星_6c64

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

解答:

public static String convert(String s, int numRows) {
        //考虑极端情况
        if (numRows==1) {
            return s;
        }
        char str[][] = new char[numRows][s.length()];
        int k=0;
        //做初始化工作
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j < s.length(); j++) {
                str[i][j] ='0';
            }
        }
        for (int j = 0; ; j++) {
            for (int m = 0; m < numRows; m++) {
                if(k==s.length()){
                    break;
                }
                //填充每一列数据【满】
                str[m][2*j]=s.charAt(k++);
            }
            //填充稀疏列数据
            for (int n = numRows-2; n >0; n--) {
                if(k==s.length()){
                    break;
                }
                str[n][2*j+1]=s.charAt(k++);
            }
            //必须写 否则下述代码不能用
            if(k==s.length()){
                break;
            }
        }
        
        //StringBuffer string=new StringBuffer(); time is longer
        String string="";
        for (int p = 0; p < numRows; p++) {
            for (int q = 0; q < s.length(); q++) {
                if (str[p][q]!='0') {
                     //拼接非0字符
                    //string.append(str[p][q]);
                    string+=str[p][q];
                }
            }
        }
        //return string.toString();
        return string;
    }

注意:

1.考虑到输出的顺序,其实斜行处理时可以作为一竖行。
2.StringBuilder与StringBuffer与String的比较:
A:运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String【String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,】;
B:在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的;
C:总结一下,String:适用于少量的字符串操作的情况、StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况、StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

上一篇下一篇

猜你喜欢

热点阅读