Z字形变换

(1)按行存:按行将正确的字符追加到存每行字符的StringBuffer上,最后按照行的顺序将存放的每行字符合到一起即是所需结果;

 class Solution {
        //从头按行添加元素到指定的行,然后按顺序连一起输出即是结果
        public String convert(String s, int numRows) {
            //numRows = 1时就直接输出原字符串
            if(numRows == 1)
                return s;
            //按顺序存取访问用ArrayList,存放变长的String,用StringBuffer;
             List<StringBuffer> list = new ArrayList<>();
            //一般需要numrows个StringBuffer,除非s.length() < numrows;
            for (int i = 0; i < Math.min(s.length(),numRows); i ++) 
                list.add(new StringBuffer());
            /**Z字形就是从头到尾在尾到头循环
            1.需要控制list的索引变化将值加到正确的StringBuffer中;
            2.加入判断,头就开始加,到尾则开始减,循环把所有字符存入集合中;**/
            int rows = 0;//记录要存入的StringBuffer索引,即行数;
            boolean flag = false;//控制索引变化
            for (Character c : s.toCharArray()) {
                list.get(rows).append(c);
                //第一轮是加1再减1再加1,循环,每次到零界是都要控制
                if (rows == 0 || rows == numRows - 1)
                    flag = !flag;
                rows += flag ? 1 : -1;
            }
            StringBuffer buf = new StringBuffer();
            for(StringBuffer buffer : list) {
                buf.append(buffer.toString());
            }
            return buf.toString();
        }
    }

按行读:直接一次遍历中就按行的顺序读取所需字符,最终将所有的字符都按顺序追加到一个StringBuffer中,这个结果就是所需;

class Solution {
    //直接将原字符串的每个字符按照列的顺序一次遍历完成追加
    public String convert(String s, int numRows) {
        //numRows = 1时就直接输出原字符串
        if(numRows == 1)
            return s;
        //直接用一个接收结果,追加即可
        StringBuffer buf = new StringBuffer();
        int n = s.length();
        //两完整列相同行元素之间的差值
        int v = 2 * numRows - 2;
        //控制行数
        for (int i = 0;i < numRows; i ++) {
            //控制索引
            for (int j = 0; i + j < n; j += v) {
                //存所有完整竖列的字符
                buf.append(s.charAt(i + j));
                //内部斜着的字符追加,头尾是没有的
                if (i != 0 && i != numRows - 1 && j + v - i < n)
                    buf.append(s.charAt(j + v - i));
            }
        }
        return buf.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值