Leetcode006--字符串的Z字型打印


一、原题



  The 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 
  APLSIIG 
  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”



二、中文



输入一个字符串和指定的行数,将字符以Z字型输出。 



三、举例



例如输入PAYPALISHIRING,输出是PAHNAPLSIIGYIR



四、思路



(1)首先计算最大的列数,然后根据行数和列数创建一矩阵

(2)循环向这个矩阵中写入字符,根据一列和一斜行的顺序来写入

(3)最后读出矩阵中的字符,其中这个矩阵可以是一个字符串



五、程序


package LeetCode;

public class Leetcode006 {
	public static void main(String args[]){
		String str = "ABCDEFGHIJKLSJDFLJSLFJLSDJFLKSDJFLSAJFSLD";
//		System.out.println(convert(str, 3));
		convert(str, 8);
	}
	   
    /**
     * @param 字符串的Z字型输出
     * @return
     */
    public static void convert(String s, int n) {
    	int len = s.length();
    	// 首先计算行的长度,包括最后的换行字符
    	int slash = n - 2;
    	int rowLength = 0;
    	while(len > 0){
    		//竖列
    		len = len - n;
    		rowLength++;
    		
    		//斜着的一列
    		for(int i = 0; i < slash && len > 0; i++){
    			len--;
    			rowLength++;
    		}
    	}
    	
    	// 建立一个多一列的数组用于保存我们的字符串,并且全部初始化为空格了
    	char result[] = new char[n * rowLength];
        for (int i = 0; i < result.length; i++) { // 初始化为空格
            result[i] = ' ';
        }
        
        int curColumn = 0; // 当前处理的行数
        int index = 0;
        
        // 下面将字符串写入所谓的矩阵中
        while(index < s.length()){
        	//写入列
        	for(int i = 0; i < n && index < s.length(); i++){
				result[rowLength * i + curColumn] = s.charAt(index);
				index++;
        	}
        
        	curColumn++;
        	
        	//写入斜线,这个是难点啊
        	for(int i = n - 2; i > 0 && index < s.length(); i--){
        		result[rowLength * i + curColumn] = s.charAt(index);
        		curColumn++;
        		index++;
        	}
        }
        
        int flag = 0;
        
        for(int i = 0; i < curColumn; i++){
        	for(int j =0; j < rowLength; j++){
        		if(flag < result.length){
        			System.out.print(result[i * curColumn + j]);
        		}
        		flag++;
        	}
        	System.out.println();
        }
        
        
        
//        // 如下是去空格的操作,定义两个指针循环进行操作
//        index = 0;
//        while (index < s.length() && result[index] != ' ') { // 找第一个是空格的字符位置
//            index++;
//        }
//        int next = index + 1;
//        while (index < s.length()) {
//            while (next < result.length && result[next] == ' ') { // 找不是空格的元素
//                next++;
//            }
//            result[index] = result[next];
//            index++;
//            next++;
//        }
//        return new String(result, 0, index);
        
    }
}




你可能感兴趣的:(【LeetCode】)