力扣06-Z字形变换(java代码实现)

本文介绍了一种将字符串按Z字形排列并重新读取的方法。通过遍历字符,利用标志位实现正反向填充,最终组合成新的字符串。代码示例展示了如何使用Java实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

 之后,输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
String newString = convert(String s, int numRows);
#解题思路
1.首先需要判断输入的行数numRows是否为1,如果是1,则直接返回s即可
2.将输入字符串s转为字符集合,Char[] charc = s.toCharArray();
3.在进行Z字形变换的时候,会存在numRows行,m列,从第一列开始进行遍历,假设数组charc的下表为S0到Sn.

4.第一行第一列为S0,第二行第一列为S1,以此类推,第numRows-1行为S(numRows-1),当填充到最后一行时,此时i=numRows-1(i标识行数),此时需要反向遍历,进行数据填充,此时填充的数据是i-1行的数据。为标识正向填充和反向填充,此时需要引入一个标志位flag,默认为-1,当遍历到第0行和第numRows-1行进行变换,然后i每循环一次i=i+flag,直至输入字符串s遍历结束

5.将所有行的字符串组合起来,就形成最后的输出样式了

package lee;

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

public class Solution6 {
    public static void main(String args[]) {
    	String s = "PAYPALISHIRING";
    	Solution6 solution = new Solution6();
    	String newStr = solution.convert(s, 4);
    	System.out.println(newStr);
    }
    
	public String convert(String s, int numRows) {
		if (numRows < 2) {
			return s;
		}
		char[] stringChar = s.toCharArray();
		List<StringBuffer> list = new ArrayList<StringBuffer>();
		for (int i = 0; i < numRows; i++) {
			list.add(new StringBuffer());
		}
		int i = 0;
		int flag = -1;
		for (char c : stringChar) {
			list.get(i).append(c);
			if (i == 0 || i == numRows - 1) {
				flag = -flag;
			}
			i = i + flag;
		}
		StringBuffer newStr = new StringBuffer();
		for (StringBuffer str : list) {
			newStr.append(str);
		}
		return newStr.toString();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值