Z字形模式转换
?题目:有一个字符串?"PAYPALISHIRING",它将使用Z字形模式转换成如下的方式:
?
P A H NA P L S I I GY 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();}}
?
?
?