day08(11.5)——leetcode面试经典150

6. Z 字形变换

6. Z字形变换

真没招了,果然还是得仔细,一不小心就出错啊啊啊啊啊
我用的依旧是笨办法,直接就是弄一个二维字符数组,然后往里面一个一个塞,再遍历找出来

唯一要注意的就是没有值的ascll码为0, 值为‘\0’
先处理竖着的,再处理中间斜着的

题目:

题解:

class Solution {
    public String convert(String s, int numRows) {
        StringBuilder st = new StringBuilder();
        if(numRows == 1) {
            return s;
        }
        char[][] str = new char[numRows][s.length()];
        int x = 0;
        int y = 0;
        int i = 0;
        while(i<s.length()) {
            while(x<=numRows-1&&i<s.length()) {
                str[x][y] = s.charAt(i);
                x++;
                i++;
            }
            x-=2;
            y++;
            while(x>=1&&i<s.length()) {
                str[x][y] = s.charAt(i);
                x--; 
                y++;
                i++;
            }
            x=0;
        }
        for(i=0;i<numRows;i++) {
            for(int j=0;j<s.length();j++) {
                if(str[i][j] != 0) {
                    st.append(str[i][j]);
                }
            }
        }
        return st.toString();
    }
}

我觉得还是得看个题解,这个方法有点太笨了

class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2) {
            return s;
        }
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i=0;i<numRows;i++) {
            rows.add(new StringBuilder());
        }
        // 定义行数,以及进行控制方向flag
        int i=0, flag=-1;
        // 遍历每一个字符
        for(char c : s.toCharArray()) {
            // 第i行的元素进行拼接
            rows.get(i).append(c);
            // 如果到了第一行或者最后一行就需要进行转向
            // 这就是为什么一开始flag要设置成-1了
            if(i == 0 || i == numRows-1) {
                flag = -flag;
            }
            // 不断走
            i+=flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row:rows) {
            res.append(row);
        }
        return res.toString();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值