您的位置:首页 > 其它

ZigZag Conversion [Z 型字母转换]

2014-12-25 15:48 316 查看
he string
"PAYPALISHIRING"
is written in a zigzag pattern on a given number
of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P   A   H   N
A P L S I I G
Y   I   R

And then read line by line:
"PAHNAPLSIIGYIR"


Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);

convert("PAYPALISHIRING", 3)
should
return
"PAHNAPLSIIGYIR"
.

如下图



public class Solution {

public String convert(String s, int nRows) {
if(nRows>=2){
//计算字符总长度
int len=s.length(),index=0,i,j;
int nColumns=len;
//通过计算可以获得nRow和间隔之间的宽度gap,gapCount用于当前位与间隔的位置
int gap=nRows-2,gapCount=0;
char[] arr=s.toCharArray();
//数组缺省值为整型0
char [][] arrTable=new char[nRows][nColumns];
for(j=0;j<nColumns && index<len;j++){
for(i=0; i<nRows&&index<len; i++){
if(j==0 || gapCount==0){
arrTable[i][j]=arr[index];
index++;
}else{
//处于间隔中
//注意下标从0开始
if(i==(nRows-1)-gapCount){
arrTable[i][j]=arr[index];
index++;
}
}
}
if(gapCount==gap){
gapCount=0;
}else{
gapCount++;
}
}
char [] responeArr=new char[len];
index=0;
for(i=0;i<nRows&&index<len;i++){
for(j=0;j<nColumns&&index<len;j++){
if(arrTable[i][j]!=0){
responeArr[index]=arrTable[i][j];
index++;
}
}
}
return String.valueOf(responeArr);
}else{
return s;
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution s=new Solution();
String newS=s.convert("PAYPALISHIRING", 3);
System.out.print(newS.toString());
}

}


下面是高效方法Runtime: 572 ms

public class Solution {
public String convert(String s, int nRows) {
if(nRows>=2){
//计算字符总长度
int len=s.length(),index=0,i,j;
//通过计算可以获得nRow和间隔之间的宽度gap,gapCount用于当前位与间隔的位置
int gap=nRows-2,gapRemain=0;
char[] arr=s.toCharArray();
//数组缺省值为整型0
char [] responeArr=new char[len];
//横向扫描,按照字符串最终位置获取数据
//第一行与最后一行相同
for(i=0;i<len;i+=(nRows-1)*2){
responeArr[index++]=arr[i];
}
//中间部分
gapRemain=gap;
for(i=1;i<nRows-1;i++){
for(j=i;j<len;j+=2*(gap+1)){
responeArr[index++]=arr[j];
if(j+2*gapRemain<len){
responeArr[index++]=arr[j+2*gapRemain];
}
}
gapRemain--;
}
//最后一行
for(i=nRows-1;i<len;i+=(nRows-1)*2){
responeArr[index++]=arr[i];
}
return String.valueOf(responeArr);
}else{
return s;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution s=new Solution();
String newS=s.convert("PAYPALISHIRING", 2);
System.out.print(newS.toString());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: