Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

    P   A   H   N
    A P L S I I G
    Y   I   R
    之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

    实现一个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows);
    示例 1:

    输入: s = "PAYPALISHIRING", numRows = 3
    输出: "PAHNAPLSIIGYIR"
    示例 2:

    输入: s = "PAYPALISHIRING", numRows = 4
    输出: "PINALSIGYAHRPI"
    解释:

    P     I    N
    A   L S  I G
    Y A   H R
    P     I

 

这个题有毒,看了很多遍没看懂什么意思,Z字形??后来才发现这根本就不是Z字形,明明是Z旋转90度后在镜像对称。

按这个顺序排列字符串,排列好后再按逐行的顺序转换为字符串。

思路还是很清晰,先根据给定的行数构造一个二维数组,然后按照Z字形填递增的数字,最后遍历这个数组根据String.charAt(),输出字符串就行

	public String convert(String s, int numRows) {
		if(numRows==1||s.equals(""))return s;
		StringBuilder sb=new StringBuilder();
		int[][] a=new int[numRows][s.length()];
		//j代表行数,i代表列数,k代表字符串的长度
		for(int i=0,k=-1,j=-1;k<s.length()-1;) {
			if((j+1)%numRows!=0||k==-1) {
				a[++j][i]=++k;
			}else {
				while(j>0&&k<s.length()-1) {
					a[--j][++i]=++k;
				}
			}
		}
		sb.append(s.charAt(0));
		for(int[]c:a) {
			for(int d:c) {
				if(d!=0)sb.append(s.charAt(d));
			}
		}
		return sb.toString();
        
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值