LeetCode6. ZigZag Conversion

  1. 题目链接
  2. 题意
    • 给出一个字符串, 你需要进行Z形重排然后输出
  3. 解题思路
    • 思路一
      • 建立min(numRows, s.length())个StringBuilder模拟
    • 思路二
      • 利用Z形重排后下标的数学关系直接得出重排后的字符串, 我们可以观察得到这样的规律, 如下图, P与I, A与S, S与G的差值都是numRows * 2 - 2, 第二行A与L, S与I的差值都是(numRows * 2 - 2) - (2 * 1), 同理下一行是(numRows * 2 - 2) - (2 * 2)
  4. AC代码
  • 思路一代码
class Solution {
    public String convert(String s, int numRows) {
        
    	if(s.length() == 0 || numRows == 1) return s;
    	
    	char[] chars = s.toCharArray();
    	StringBuilder[] anStringBuilders = new StringBuilder[Math.min(numRows, s.length())];
        
        boolean check = false;
        
        int idx = 1;
        for(int i = 0; i < s.length(); ++i) {
        	idx += check ? 1 : -1;
        	if(anStringBuilders[idx] == null) anStringBuilders[idx] = new StringBuilder();
        	
        	anStringBuilders[idx].append(chars[i]);
        	
        	if(i % (numRows - 1) == 0) check = !check;
        }
        
        StringBuilder ans = new StringBuilder(s.length());
        for (StringBuilder stringBuilder : anStringBuilders) {
        	ans.append(stringBuilder);
        }
        return ans.toString();
    }
}
  • 思路二代码
class Solution {
    public String convert(String s, int numRows) {
        int length = s.length();
        
        if(numRows > length || numRows <= 1)
            return s;
        
        char[] zigZagChars = new char[length];
        int count = 0;
        
        int interval = 2 * numRows - 2;
        
        for(int i = 0; i < numRows; i++){
            int step = interval - 2 * i;
            for(int j = i; j < length; j += interval){
                zigZagChars[count] = s.charAt(j);
                count++;
                if(step > 0 && step < interval && j + step < length){
                    zigZagChars[count] = s.charAt(j + step);
                    count++;
                }
            }
        }
        return new String(zigZagChars);
    }
}
原文地址:https://www.cnblogs.com/fan-jiaming/p/12786115.html