ZigZag Conversion [Z 型字母转换]

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());
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值