LeetCode_6---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".
    题目翻译:根据ZIGZAG模式,翻译字符串,模型如下

    Zigzag:即循环对角线结构

    0       8       16      
    1     7 9     15 17      
    2   6   10   14   18      
    3 5     11 13     19      
    4       12       20      

    向下循环:nRows

    斜角线循环:nRows-2(减去首尾两个端点)


    Code:

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 
     */
    
    /**
     * @author MohnSnow
     * @time 2015年6月1日 下午5:01:05
     * 
     */
    public class LeetCode6 {
    
    	/**
    	 * @param argsmengdx
    	 *            -fnst
    	 */
    	public static String convert(String text, int nRows) {
    		if (nRows == 1) {
    			return text;
    		}
    		Map<Integer, StringBuilder> result = new HashMap<>(nRows);
    		int eachRoundNumber = 2 * nRows - 2;//循环一组的下标长度
    		for (int i = 1; i <= nRows; i++) {//map初始化
    			result.put(i, new StringBuilder());
    		}
    		for (int i = 1; i <= text.length(); i++) {//模拟过程
    			int key = i % eachRoundNumber;
    			key = key == 0 ? eachRoundNumber : key;//巧妙使用三目运算符
    			key = key <= nRows ? key : nRows - (key % nRows);
    			result.get(key).append(text.charAt(i - 1));//字符起始位置为0
    		}
    		StringBuilder rest = new StringBuilder();//整合结果
    		for (int i = 1; i <= nRows; i++) {
    			rest.append(result.get(i));
    		}
    		return rest.toString();
    	}
    
    	public static String convert1(String text, int nRows) {
    		if (nRows == 1) {
    			return text;
    		}
    		Map<Integer, StringBuilder> result = new HashMap<>(nRows);
    		int eachRoundNumber = 2 * nRows - 2;//循环一组的下标长度
    		for (int i = 1; i <= nRows; i++) {//map初始化
    			result.put(i, new StringBuilder());
    		}
    		for (int i = 1; i <= text.length(); i++) {//模拟过程
    			int key = i % eachRoundNumber;
    			if (key == 0) {
    				result.get(2).append(text.charAt(i - 1));
    			}else if (key <= nRows) {
    				result.get(key).append(text.charAt(i - 1));
    			} else {
    				result.get(2 * nRows - key).append(text.charAt(i - 1));
    			}
    		}
    		StringBuilder rest = new StringBuilder();//整合结果
    		for (int i = 1; i <= nRows; i++) {
    			rest.append(result.get(i));
    		}
    		return rest.toString();
    	}
    
    	public static void main(String[] args) {
    		String s = "abcdefadfg";
    		int a = 3;
    		System.out.println(s + "2");
    		System.out.println(convert(s, a));
    		System.out.println(convert1(s, a));
    	}
    
    }
    





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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值