6. Z 字形变换

该博客介绍了如何实现Z字形字符串变换,即给定一个字符串和行数,将其按照Z字形排列并按行读取。示例中展示了将字符串'LEETCODEISHIRING'按3行和4行排列的方法,分别输出了'LCIRETOESIIGEDHN'和'LDREOEIIECIHNTSG'。博主提供了两种不同的解决方案,一种是通过位置规律实现,另一种是使用多个列表按行存储后再合并。
/**
 * 6. Z 字形变换
 * @author wsq
 * @date 2020/09/24
	将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
	比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
	L   C   I   R
	E T O E S I I G
	E   D   H   N
	之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
	请你实现这个将字符串进行指定行数变换的函数:
	string convert(string s, int numRows);
	
	示例 1:
	输入: s = "LEETCODEISHIRING", numRows = 3
	输出: "LCIRETOESIIGEDHN"

	示例 2:
	输入: s = "LEETCODEISHIRING", numRows = 4
	输出: "LDREOEIIECIHNTSG"
	解释:
	L     D     R
	E   O E   I I
	E C   I H   N
	T     S     G
	
	链接:https://leetcode-cn.com/problems/zigzag-conversion
 */
package notsubmit;

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

public class ZigzagTransformation {
	/**
	 *	通过寻找每一行元素之间的位置规律实现按行访问。
	 *	官方给的解法一,看完之后觉得自己很菜了,这里将解法一也写在下面
	 * @param s
	 * @param numRows
	 * @return
	 */
	public String convert(String s, int numRows) {
		if(s.length() < numRows) {
			return s;
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < numRows; i++) {
			int pos = i;
			while(pos < s.length()) {
				sb.append(s.charAt(pos));
				pos += 2 * numRows - 2;
				if((i != 0 && i != numRows - 1) && (pos - 2 * i) < s.length()) {
					sb.append(s.charAt(pos - 2 * i));
				}
			}
		}
		return sb.toString();
	}
	/**
	 *	官方的解法一,想法很独特,唯一不足就是空间的消耗
	 *	用四个列表存储对应排序后的元素
	 * @param s
	 * @param numRows
	 * @return
	 */
	public String convert2(String s, int numRows) {
		if(numRows == 1) {
			return s;
		}
		List<StringBuilder> rows = new ArrayList();
		for(int i = 0; i < Math.min(s.length(), numRows); i++) {
			rows.add(new StringBuilder());
		}
		
		boolean goDown = false;
		int curRow = 0;
		for(char c: s.toCharArray()) {
			rows.get(curRow).append(c);
			if(curRow == 0 || curRow == numRows - 1) {
				goDown = !goDown;
			}
			curRow += goDown ? 1 : -1;
		}
		StringBuilder ans = new StringBuilder();
		for(StringBuilder sb: rows) {
			ans.append(sb);
		}
		return ans.toString();
	}
	
	
	public static void main(String[] args) {
		String s = "LEETCODEISHIRING";
		int numRows = 3;
		ZigzagTransformation zt = new ZigzagTransformation();
		String ans = zt.convert2(s, numRows);
		System.out.println(ans);
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值