Z字形模式转换

 题目:有一个字符串 "PAYPALISHIRING",它将使用Z字形模式转换成如下的方式:

 

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

一行一行读,"PAHNAPLSIIGYIR"

请写出一个函数,它的输入参数有两个,一个是需要转化的字符串s,一个是行数n,

string convert(string text, int nRows);

输入("PAYPALISHIRING", 3) 应该返回 "PAHNAPLSIIGYIR".

这个需要考虑的是使用二维数组来保存这个字符串,先是用列去保存,然后一行一行的读,就是题目的要求。

问题是如何确定数组的列数了?

 

其实,我们能够发现规律,我们知道了行数,也就是第一列能保存为n(输入参数决定),第二列是1个,一共n-2个列数是输入一个的,然后又是输入n,所以前n-1个作为一个单元,能输入n+n-2个字符,所以

 

需要列数为s的字符总长度,除以n+n-2,得到需要多少单元,一个单元是n-1列

 

总共需要为 s.length()*(nRows-1)/(nRows+nRows-2)+1;后面的1保证如果不能整除n+n-2,后面的字符需要多处一个单元存储。

 

按照规律存放数据,然后按照行读取,代码不解释

 

public class Solution {
    public String convert(String s, int nRows) {
		if(nRows==1)
			return s;
		int length=s.length()*(nRows-1)/(nRows+nRows-2)+1;
		if(length==0)
			length++;
		char conver[][]=new char[nRows][length];
		
		char []temp=s.toCharArray();
		int j=0;int k=0; boolean flag=true;
		while(k<temp.length){
		 if(flag){
		   for(int i=0;i<nRows;i++){
			  if(k>=temp.length)
				  break;
			  conver[i][j]=temp[k];
			  k++;
		   }
		   j++;
		   flag=false;
		   }	
		 else	
		 {
			 for(int i=nRows-2;i>0;i--){
				 if(k>=temp.length)
					 break;
				conver[i][j]=temp[k];
				j++;
				k++;
			 }
			 flag=true;
		 }
		}
		StringBuffer outcome=new StringBuffer();
		for(int i=0;i<conver.length;i++){
			for(int column=0;column<conver[i].length;column++){
				if(conver[i][column]!=(char)0)
					outcome.append(conver[i][column]);
			}
		}
		return outcome.toString();
		
	}
}

 

 

 

你可能感兴趣的:(Z字形模式转换)