Leetcode 6. ZigZag Conversion(java版)

来源:互联网 发布:软件测试工资待遇2017 编辑:程序博客网 时间:2024/06/07 04:09

题目 and example:

这里写图片描述

题目大意:

给一个字符串,需要将这个字符串按照“|/|”这样的顺序排列,然后按行再将字符串合并。

思路:

  1. 每一组 V 字形的长度为 size = 2 * line - 2 (斜向上的部分没有第一行和最后一样的元素),line 是行数
  2. 对于垂直向下的一列元素来说,每一组向下的列之间间隔 size 大小,即一组元素的个数。
  3. 对于斜向上的元素来说,它们的位置位于当前组 size - i(i 为该元素所在的行数,一组有 size 个字符,倒数第 i 个,位置为 size - 1)。当前组的第一个字符所在位置为 j - i (j 为与斜向上的元素同在一行的,垂直向下的列的元素在字符串中的序号,i 为它们共同的行号)。
    即:j-i就是zigzag的起始字符,然后我们是要倒数第i个,因为一个zigzag有size个字符,所以倒数第i个就是size-i,我们要赋值的字符就是(j-i)+(size-i)=j+size-2*i

代码:

class Solution {    public String convert(String s, int numRows) {        if(s == null || s.length() == 0 || numRows <= 0)            return "";        if(numRows == 1 || s.length() == 1) return s;        StringBuilder ans = new StringBuilder();        int size = numRows * 2 - 2;        for(int i = 0 ; i < numRows ; i++) {            for(int j = i ; j < s.length() ; j += size) {                ans.append(s.charAt(j));                if(i != 0 && i != numRows - 1 && j + size - i * 2 < s.length()){                    ans.append(s.charAt(j + size - i * 2));                }            }        }        return ans.toString();    }}
原创粉丝点击