6. Z 字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

1、这代码写的简直在犯罪,java的二维ArrayList跟想象中的不太一样 // List<Character>[][] lists = new ArrayList[numRows][];
感觉没有C++好用,直到看了题解才发现可以在泛型里放StringBuilder,原来是自己太菜
2、 注释为官方题解

class Solution {
    public String convert(String s, int numRows) {
      
      /*    官方题解
      List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows, s.length()); i++)
            rows.add(new StringBuilder());
	*/
	
        if(s.length()<2 || s.length()<=numRows || numRows ==1)
            return s;
        ArrayList<ArrayList<Character>> lists = new ArrayList<>();
        int path = 0;
        boolean goDown = true;

      /*    官方题解 foreach真香!curRow这段写的真漂亮
        for (char c : s.toCharArray()) {
            rows.get(curRow).append(c);
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }
	*/
	
        for(int i=0; i<s.length(); i++){
            if(i<numRows){
                ArrayList<Character> tmp = new ArrayList<>();
                lists.add(tmp);
            }
            lists.get(path).add(s.charAt(i));
            if(goDown)
                path++;
            else
                path--;
            if(path >= numRows){
                path = numRows-2;
                goDown = !goDown;
            }
            if(path < 0){
                path = 1;
                goDown = !goDown;
            }   
        }
        
		/*官方题解
		StringBuilder ret = new StringBuilder();
        for (StringBuilder row : rows) 
        	ret.append(row);
        return ret.toString();
		*/

        StringBuilder ans = new StringBuilder();
        for(int i=0; i<numRows; i++){
            int len =lists.get(i).size();
            for(int j=0; j<len; j++)
                ans.append(lists.get(i).get(j));
        }
        return ans.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值