6. Z字形变换

                                              6. Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

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

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:

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

确定好列的数量,(行数可以是1,测试数据的字符串长度可以为零)
字符串数量为0,直接返回空字符串;为1,返回原字符串。
掌握好规律:可以当成一个周期(一行数numRows加m个数)的循环填入。

java的code:

class Solution {
    public String convert(String s, int numRows) {
     int len = s.length();
        if(len == 0) {
        	return "";
        }
        if(numRows == 1) {
        	return s;
        }
        int m = numRows - 2;
        int numRows_m = numRows + m;
        String resultString = "";
        int lie = len/(numRows_m)*(1+m );
       
        if(len%numRows_m != 0  ) {
        	if(len%numRows_m <= numRows){
        		lie++;
        	}else{
        		lie = lie + m+1;
        	}
        }
        Character [][] arr = new Character[numRows][lie];
        for(int i = 0; i < numRows; i++) {
        	for(int j = 0; j < lie; j++) {
        		arr[i][j] = ' ';
        	}
        }
        char [] arr2 = s.toCharArray();
        int num = len / numRows + 1;
        int arr2_i = 0;
        for(int i = 0; i < num; i++) {
        	for(int j = 0; j < numRows; j++) {
        	arr[j][i *(m+1)] = arr2[arr2_i++];	
        		if(arr2_i == len){
        			break;
        		}
        	}
        	
        	if(arr2_i == len){
    			break;
    		}
        	
        	int p = 1;
        	for(int j = numRows -2; j > 0; j--){
        		//System.out.println(j + "     " +i*(m+1)+ p+ "   " + arr2_i);
        		
        		arr[j][i*(m+1)+ p]	= arr2[arr2_i++];
        	    if(arr2_i == len) {
        	    	break;
        	    }
        	    p++;
        	}
        	
        	if(arr2_i == len) {
        		break;
        	}
        }
        	
        StringBuilder sBuilder = new StringBuilder();
        for(int i = 0; i < numRows; i++) {
        	for(int j = 0; j < lie; j++) {
        	//	System.out.print(arr[i][j] + " ");
        		if(arr[i][j] != ' ') {
        			sBuilder.append(arr[i][j]);
        		}
        	}
       // 	System.out.println();
        }
        return sBuilder.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/81560495