LeetCode-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)



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 "PAHNAPLSIIGY
将给定的字符串以“Z”行书写,如图所示。根据输入的字符串和行数做如下变换:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGY

分析

这个题看懂题意是关键。主要是提取相应位置的坐标,组成新的字符串

  • 行数n=2时


    n=2
  • 行数n=3时


    n=3
  • 行数n=4时


    n=4

根据上面三幅图分析,分为如下几个步骤:

  1. 红色部分字符个数为2n-2(其中n为行数)
  2. 每个列间相邻的两个字符的索引数相差2n-2(暂时不管斜线上的字符)
  3. 看斜线上的字符,索引总是j+(2n-2)-2i(其中j为列索引,i为行索引,需要联系下面代码for循环中理解)

java代码

public class Solution {
    public String convert(String s, int numRows) {
        int s_length = s.length();
        if (s_length <= numRows || numRows == 1) return s;
        
        char[] result = new char[s_length];
        int size_1 = 2 * numRows - 2;//向下数size_1个字符即为要添加到result中的字符
        int count = 0;
        
        for (int i = 0; i < numRows; i ++) {//表示行
            for (int j = i; j < s_length; j += size_1) {//表示列
                result[count ++] = s.charAt(j);
                if (i != 0 && i != numRows - 1) {//如果不是第一行和最后一行
                    int temp = j +size_1 -2 * i;//下一个要加入result中的字符索引
                    if (temp < s_length) {
                        result[count ++] = s.charAt(temp);//不能超过字符的长度
                    }
                }
            }
        }
        return new String(result);
    }
}

参考

  1. LeetCode-6
  2. ZigZag Conversion leetcode java

你可能感兴趣的:(LeetCode-6~ZigZag Conversion)