当前位置 : 主页 > 编程语言 > c++ >

【LeetCode】ZigZag Conversion

来源:互联网 收集:自由互联 发布时间:2021-06-30
ZigZagConversion.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
ZigZagConversion.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".
     * How to fix it? My Solution is:
     * There is a pointer which scan each row,
     * if is first row or last row, then you can find split: = (2*rowNum - 2)
     * else you can find: splitUp = (2*(rowNum-i)-2) and splitDown=i*2
     * so it's easy enough to convert it
	 * @param s
	 * @param numRows
	 * @return
	 */
	public static String convertZigzag(String s, int numRows) {
		int length = s.length();
		if (length <= 1 && numRows <= 1) {
			return s;
		}
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < numRows; i++) {
			// 处理第一行和最后一行
			if (i == 0 || i == numRows - 1) {
				for (int j = i; j < s.length(); j += (2 * numRows) - 2) {
					sb.append(s.charAt(j));
				}
				continue;
			}
			// 处理中间行
			int tmp = i;
			int tmpCount = 0;
			boolean isUp = true;
			boolean isFirst = true;
			while (tmp < s.length()) {
				if (isFirst) {
					if (tmp < numRows) {
						sb.append(s.charAt(tmp));
						tmpCount++;
						isFirst = false;
					}
				}
				if (isUp) {
					tmp += 2 * (numRows - i) - 2;
				} else {
					tmp += i * 2;
				}
				if (tmp < s.length()) {
					sb.append(s.charAt(tmp));
					tmpCount++;
				}

				if (tmpCount % 2 == 0) {
					isUp = false;
				}
			}
		}
		return sb.toString();
	}
网友评论