• 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);
        }
    }
    
  • 相关阅读:
    判断回文字符串
    汉诺塔递归问提
    课程作业02.2
    编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。
    《大道至简》第一章java伪代码分析
    《大道至简》读后感
    用户体验
    大二上学期软件工程概论学习进度表(第十五周)
    12-24个人博客
    大二上学期软件工程概论学习进度表(第十四周)
  • 原文地址:https://www.cnblogs.com/fan-jiaming/p/12786115.html
Copyright © 2020-2023  润新知