LeetCode【6】. ZigZag Conversion --思路图解与java实现

ZigZag Conversion

一、题目如下:    

     The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R 
And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

       题目大意为将给定字符串按如上的“Z”字锯齿形进行重排。

二、思路

       如图,将该图形进行分区。


图一、分区图

       从以上我们可以很清晰地根据给定字符串的索引来求出其在一个“Z”型中所处的位置,是处于竖行还是斜行,是在第几排。思路清晰,结合图及以下代码、注释,可以很快明白思路。 

三、Java实现

public class Solution {
    public String convert(String s, int numRows) {
        int sl = s.length();
        if(numRows<=1||sl<=numRows)                        
           return s;
        
        int N = (int)Math.ceil((double)sl/(2*numRows-2));  //1. 计算分区大小,最后一个区可能是充满也可能是不满,所以向上取整
        int index1=0, index2=0;
        int nN = 2*numRows-2;                              //2. 求出一分区内有多少元素。竖行是numRows个,斜行需减去头尾两个元素
        StringBuffer sb = new StringBuffer();
        
        for(int iR = 1; iR<=numRows; iR++)                 //3. 按行进行扫描输出
        {
            for(int jN = 1; jN<=N; jN++)                   //4. 扫描iR行的不同分区
              {
            	//4.1. index1为第jN块的第iR行竖值索引
                index1 = (jN-1)*nN + iR;                      
                
                if(index1<=sl)
                {
                    sb.append(s.charAt(index1-1));       
                 }
               //4.2. index2为第jN块的第iR行斜值索引,斜行去掉头尾两个
                if((iR!=1)&&(iR!=numRows))   
                {
                  index2 = (jN-1)*nN + 2*numRows -iR; 
                 
                  if(index2<=sl)
                  {
                	sb.append(s.charAt(index2-1));
                	
                  }
                }
              }
        }
        return sb.toString();
    }
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值