题6、 Z 字形变换

巧了我就是萌 提交于 2019-12-09 22:54:30

题6、 Z 字形变换

题目

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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”

突然发现英文社区可以把信息同步到中文社区,那还看什么英文,中文不好吗

思路

这道题呢就是给定一个字符串,按照规定的形式重新排列后进行输出。给定的形式就是横放的Z,也可以看做是特殊形态的V,看你怎么想了,反正都那样。

最开始我在想能不能找到相应的规律,也就是找到一个特殊的函数,直接把两者对应起来,结果找了半天没找到,原谅我的渣渣数学,之后做出来了,大致看了一下大神们的代码,感觉好像是有相应的函数的,但是不想再看了,也就没有在研究这个了。

之后我做题的时候突然想起来能不能用递归的算法来解决,但是仍然是凉凉,递归不好用,毕竟用的话参数可能会有点多。

最后采用的是,设置一组坐标,依次判断下一个坐标的位置,然后循环N次将每一个字符填入相应的位置。

需要注意的就是,只排列成一行和两行的情况,比较特殊,注意处理。

代码

public class T006 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println( convert( "LEETCODEISHIRING", 3 ) );
	}
	public static String convert(String s, int numRows) {
		
		//如果是只排列成一行的话,原样输出就可以了
		if(numRows == 1 )
			return s;
		//用于存储每一行的字符串,并输出
		StringBuilder[] rows = new StringBuilder[numRows];
    	for( int i = 0; i < numRows; i++ )
    		rows[i]= new StringBuilder();
    	
		int count = 0;
		int i = 1;
		int j = 1;
		
		//循环那么多次,得到结果
		while( count < s.length() ) {
			//用来判断排列到那一列了,循环到竖着的一列判定为真
			if( i%(numRows-1) == 1 || numRows == 2 ) {
				rows[j-1].append(s.charAt( count++ ));
				//rows[j-1] += s.charAt( count++ )+"";
				
				//用于判断是不是到这一列的尽头了,是的话就跳的下一列,上一行;否则行加一
				if( j+1<=numRows )
					j++;
				else{
					i++;
					j--;
				}
			}else {
				rows[j-1].append(s.charAt( count++ ));
				//rows[j-1] += s.charAt( count++ )+"";
				i++;
				j--;
			}
		}
		
    	String output = "";
    	
    	for( int k = 0; k < numRows; k++ ) {
    		output += rows[k].toString();
    		//System.out.println( k+"row:\t" + rows[k] );
    	}
    	
		return output;
	}

}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!