LeetCode-6. ZigZag Conversion (JAVA)(之字形转换)

6. ZigZag Conversion

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
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".

/**
	 * 将给定的字符串“ABCDEFGHIJK”按照给定的行数写成如下Z型:
	 * A   E   I
	 * B D F H J
	 * C   G   K
	 * 然后一行一行的读取:“AEIBDFHJCGK”
	 * @author 
	 */
	public String convert(String s, int numRows) {
		if (s == null || s.length() == 0 || numRows <= 1) {
			return s;
		}
		StringBuilder res = new StringBuilder();
		 /*
         * a   e
         * b d f
         * c   g
         * 从a到d为一个zig,size: 一个zig的大小
         */
		int size = 2 * numRows - 2;
		for (int i = 0; i < numRows; i++) {
			// 外层循环i表示第几行(从0开始)
			// 内层序号j表示第几个zig(从0开始)
			for (int j = i; j < s.length(); j += size) {
				res.append(s.charAt(j));
				// zig的第一行和最后一行中间的行
				// 每一个zig有两个元素在同一行,如:b和d在同一行
				// 同一行中的两个元素之间的距离是:size-2*i(size一个zig的大小,i当前是第几行,从0开始)
				// 同一个zig中的第一个元素在s中的位置是j,第二个元素在s中的位置是:j+size-2*i
				if (i > 0 && i < numRows - 1) {
					int mid = j + size - 2 * i;
					if (mid < s.length()) {
						res.append(s.charAt(mid));
					}
				}
			}
		}
		return res.toString();
	}

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/mine_song/article/details/70207667
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞