leedcode刷题-----Z字形变换

力扣刷题----Z字形变换

  • 题目描述
  • 答题思路

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数

答题思路

我是小白,在看到这道题是乍一眼看感觉很简单,不就是把字母按顺序排下来,但是在实现的过程却十分艰辛.
后来冥思苦想,一开始觉得和画出等腰三角形的一样,其实不然,因为要考虑什么位置放什么字母.
我的思路是把Z字上半部分和下半部分分别作为三角形来处理,第一行和最后一行单独处理即可.
leedcode刷题-----Z字形变换_第1张图片
代码如下:

class Solution {
    public String convert(String s, int numRows) {
		if(s.length()==1 || numRows==1){
            return s;
        }
        int len = s.length();
		char[] ch = new char[len];
		int m = 0;
		for(int i=0;i<numRows;i++) {
            int n = i;
			while(n<s.length()) {
				// System.out.print(s.charAt(n));
				ch[m] = s.charAt(n);
				m++;
				int j=0;
				if(i%(numRows-1)==0) {
					for(;j<numRows-2;j++) {
						// System.out.print(" ");	
					}
				}
				
				if(i%(numRows-1)!=0 && (n+2*(numRows-i-2)+2)<s.length()) {
					for(;j<numRows-i-2;j++) {
						// System.out.print(" ");	
					}
					// System.out.print(s.charAt(n+2*(numRows-i-2)+2));
					ch[m] = s.charAt(n+2*(numRows-i-2)+2);
					m++;
					for(int k=0;k<i-1;k++) {
						// System.out.print(" ");	
					}
				}
				n += 2*(numRows-1);
			}
			// System.out.println();

		}
	return String.valueOf(ch);
	}	
}

代码中print被注释掉了,如果不注释掉,放到力扣里面运行会报,超出时间限制的错误,当时还一直以为自己的代码不行,但是在本地运行发现又可以,后来才知道,他会测试一些很长的字符串,设置很长的行数,导致力扣显示界面显示不下,才报出这个问题.
leedcode刷题-----Z字形变换_第2张图片
注释掉print就提交成功了.
leedcode刷题-----Z字形变换_第3张图片
开心,花了三个小时才想明白,哈哈哈

你可能感兴趣的:(刷题)