Leetcode 6 ZigZag Conversion

来源:互联网 发布:淘宝账号名称怎么改 编辑:程序博客网 时间:2024/05/21 07:46

一,问题描述
ZigZag问题可以举个例子:
这里写图片描述
当输入原字符串和行数后,求ZigZag后的字符串。

二,通过上述观察,我们总结一下
1,当rows=3时,0,1,2,3组成的长度是2*rows-2(即长度为4)。
当rows=4时,0,1,2,3,4,5组成的长度为2*rows-2(即长度为6)。
因此,每一轮的长度为size=2*numRows-2。

2,除了第一行和最后一行,中间的行的相邻字幕,设置a在b之前,则a与b的长度为: j+(2*nRows-2)-2*i ; (nRows表示给定的行数,j表示第j列,i表示第i行。

三,代码,AC了的,用Java实现的

import  java.util.*;public class Test2{    public static String convert(String s,int numRows)    {        if(s.length()==0||numRows<=1)//判断给定的行数是否小于等于1,或者字符串长度为0,是的话,直接输出字符串        {            return s;        }        StringBuffer sb1=new StringBuffer();//使用StringBuffer方法可以把每个字符加上,更加方便        int size=2*numRows-2;//每一轮的长度为size,size=2*numRows-2,可以看我上面给出的解释        for(int i=0;i<numRows;i++)        {            for(int j=i;j<s.length();j+=size)            {                 sb1.append(s.charAt(j));                if(i!=0&&i!=numRows-1)//除去第0行和第numRows-1行外,中间的 (行数从第0开始)                {                    if((j+size-2*i)<s.length())//除了第一列外,每一行中其他列进行判断。                    {                        sb1.append(s.charAt(j+size-2*i));                    }                }            }        }        return  sb1.toString();//使用了StringBuffer后,则使用了toString.    }    public static void main(String [] args)    {        Scanner scan=new Scanner(System.in);        String str;        String data;        int lenth;        str=scan.next();        lenth=scan.nextInt();        data=convert(str,lenth);        System.out.println("结果="+data);    }}
0 0