LeetCode之路——ZigZag Conversion

来源:互联网 发布:免费翻墙安卓软件 编辑:程序博客网 时间:2024/05/21 15:01

题目要求:将一个字符串按照锯齿形输出。
从别处copy
图片来自别处。
可以发现有这样的规律:res[i][j]=s.charAt(2*(j-1)+i-1);
首先要考虑特殊情况。
贴上代码:

package leetcode;public class ZigZagConversion {    public static void main(String[] args) {        // TODO Auto-generated method stub        String s="PAYPALISHIRING";        Solution_Zigzig sol = new Solution_Zigzig();        System.out.println(sol.convert(s, 3));        }}class Solution_Zigzig {    public String convert(String s, int numRows) {        if(numRows==1)//当一行输出时直接返回            return s;        if(s.length()<numRows)//当字符串长度小于行数时,直接返回            return s;        int i=1,j=1;//i为行数,j为列数        int len =s.length();//len为字符串长度,当经常需要调用某个函数,而这个函数的返回值不变时,可以只调用一次用一个变量接受,以减少算法复杂度————来自《CSAPP》        boolean flag = false;//当flag为true时,i--,否则i++        String solu="";//定义按照锯齿形输出接受字符串        char[][] res=new char[numRows+1][len+1];//先定义一个字符数组用以接受s返回的字符        for(i=1;i<=numRows;i++)//初始化字符数组            for(j=1;j<=len;j++)            {                res[i][j]=' ';            }        i=1;//重置行数列数        j=1;        while(2*(j-1)+i-1<len)//当字符串还有变量时循环        {            res[i][j]=s.charAt(2*(j-1)+i-1);//锯齿形规律            //System.out.print(res[i][j]+"  ");            if((j-1)%(numRows-1)!=0)                j++;            if((++i)>numRows)//当行数越界时增加列数并且将行数增量改为-1            {                i--;                j++;                                  //--i;                flag=true;            }            else            {                i--;                //flag=false;            }            if(i<1)flag=false;//当i负溢出时,将i增量改为+1;            if(flag)            {                i--;            }            else                i++;        }        //s=String.valueOf(res);        for(i=1;i<=numRows;i++)//遍历字符数组        {            for(j=1;j<len;j++)            {                //System.out.print("res["+i+"]["+j+"]="+res[i][j]+"   ");                if(res[i][j]!=' ')//若字符数组变量不为空格时,将之加入字符串                    solu+=res[i][j];            }            //System.out.println();        }        //System.out.println("solu="+solu);        return solu;            }}

总结:此题难度不大,但要耐心细心的发现规律。研一的CSAPP课程确实是一门好课!

0 0
原创粉丝点击