Z字形变换 | leetcode算法学习

执行时间和内存消耗都有点捞,但是好歹做出来了

思路:
理解题意后可知Z是竖着的,可能N更合适一点,从上到下从左到右把字符串按要求排列,第一下想到的是数组,观察后可发现可以把它分为一竖一斜线的重复执行,且每条竖线开始的下标有迹可循,每次开头所要遍历的字符个数也是相同的(除了最后一次可能不完整)。
在这里插入图片描述每一个圈为一次循环,上面是原数组遍历个数,下面是新数组每次循环下标增加的值,还有定义二维数组时列数为字符串长度一半+numRows-1 ,为了保证每个元素都能被遍历到,for循环在字符串长度的基础上加了一个循环的长度,但这样会导致字符串被遍历完时for循环还没完成的情况,所以在需要的地方加上循环退出条件

public String convert(String s, int numRows) {
        char[][] newChar = new char[numRows][s.length()/2 + numRows-1];

        char[] num = s.toCharArray();
        int i,count = 0;//新数组下标与字符串计数符
        if (num.length == 1 || numRows == 1)
            return s;
        for (i = 0; i < num.length + 2*(numRows-1); i += numRows-1) {
            if (count < num.length) {
                for ( int j = 0; j < numRows; j++) {
                    if (count == num.length) break;
                    newChar[j][i] = num[count++];
                }
                if (count == num.length) break;//防止溢出
                int k = i+1;
                for (int j = numRows-2; j > 0; j--) {
                    if (count == num.length) break;//防止溢出
                    newChar[j][k++] = num[count++];
                }
            }
            else break;
        }
        String ans = "";
        for (int j = 0; j < numRows; j++) {
            for (int k = 0; k < s.length()/2 + numRows-1; k++) {
                if (newChar[j][k] != 0) {
                    ans += newChar[j][k];
                }
            }
        }
        return ans;
    }

发现优质代码,只用了所给行数空间的一维数组操作数据,判断正序还是逆序然后下标+1/-1将被遍历到的元素连接到数组当中,最后将每格都连起来统一输出

	public String convert(String s, int numRows) {

        if(numRows==1)
            return s;

        String result[]=new String[numRows];
        for(int i=0;i<result.length;i++){
            result[i]="";//这里一定要初始化,如果不初始化的话,默认是null
        }
        boolean isDown=false;
        int index=0;
        for(int i=0;i<s.length();i++){
            result[index]+=s.charAt(i);
            if(index==0||index==numRows-1){
                isDown=!isDown;//第一次index=0时,isDown修改为true说明可以继续往下走;当index=numRows的时候说明不能继续往下走,然后把isDown修改为false
            }
            index+=isDown?1:-1;
        }
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<result.length;i++){
            sb.append(result[i]);
        }
        return sb.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值