每日力扣:6. Z 字形变换

package com.sample.suncht.algo;

import java.util.ArrayList;
import java.util.List;

/**
 * 6. Z 字形变换
 * <p>
 * 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
 * <p>
 * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
 * <p>
 * L   C   I   R
 * E T O E S I I G
 * E   D   H   N
 * 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
 *
 * 时间复杂度:O(n), 空间复杂度:O(n)
 * @author sunchangtan
 * @date 2019/3/6 11:46
 */
public class ZigzagConversion {
    public String convert(String s, int numRows) {
        if (s == null) {
            return "";
        }
        if (numRows <= 1) {
            return s;
        }

        char[] chars = s.toCharArray();
        int len = chars.length;
        if(numRows > len) {
            return s;
        }

        StringBuilder builder = new StringBuilder("");

        for (int i = 0; i < numRows; i++) {
            int span1 = 2 * (numRows - i - 1);
            int span2 = 2 * i;
            int index = i;
            int counter = 0;
            do {
                if(counter % 2 == 0) {
                    if(span1 > 0) {
                        builder.append(chars[index]);
                        index = index + span1;
                    }
                } else {
                    if(span2 > 0) {
                        builder.append(chars[index]);
                        index = index + span2;
                    }
                }
                counter++;
            } while (index < len);
        }

        return builder.toString();
    }

    public static void main(String[] args) {
        List<AlgoHelper.BiInputParams<String, Integer, String>> datas = new ArrayList<>();
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 2, "LECDIHRNETOESIIG"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 3, "LCIRETOESIIGEDHN"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 4, "LDREOEIIECIHNTSG"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 5, "LIEESGEDHNTOIICR"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 6, "LHESIEIRTEICDNOG"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", "LEETCODEISHIRING".length(), "LEETCODEISHIRING"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 1, "LEETCODEISHIRING"));
        datas.add(new AlgoHelper.BiInputParams<>("LEETCODEISHIRING", 20, "LEETCODEISHIRING"));

        AlgoHelper.assertResult(datas, new ZigzagConversion()::convert);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值