LeetCode 6 Z字形变换(二维数组实现及优化)

题目

题目

代码实现:

方法一(二维数组法):

这是用二维数组作为存储结构,双指针定位构造Z字形的代码。

col%(numRows-1) == 0是用来判断col列是不是整列,整列即该列应该全部是字符的列。


class Solution {
    public String convert(String s, int numRows) {
        int len = s.length();
        //如果是一行,返回就是原字符串
        if(numRows == 1){
            return s;
        }

        char[][] ch = new char[numRows][len];
        //构造出一个存储Z字形字符串的存储结构
        for(int i = 0;i < numRows;i++){
            for(int j = 0;j < len;j++){
                ch[i][j] = '0';
            }
        }
        int row = 0,col = 0;
        for(int i = 0;i<len;i++){
        //这是整列有字符的情况,if中if是将指针移到下一个应该放字符但还是空的二维数组位置
            if(col%(numRows-1) == 0 && row < numRows){
                ch[row][col] = s.charAt(i);
                if(row==numRows-1){
                    col++;
                    row--;
                    continue;
                }
                row++;
            }else{//两个整列之间上升的部分,row--,else中的if也是指针移动
                if(col < len && row >=0){
                    ch[row][col] = s.charAt(i);
                    if(row == 0){
                        col++;
                        row++;
                        continue;
                    }
                    row--;
                    col++;
                }
            }
        }
        String str = new String();
        for(int i = 0;i < numRows;i++){
            for(int j = 0;j < len;j++){
                if(ch[i][j] != '0'){
                    str+=ch[i][j];
                } 
            }
        }
        return str;
    }
}

结果:

结果



方法二(list法):

使用list作为存储结构,无形中就解决了二维数组中col(列)的问题,就要考虑行row怎么变换就行了。
其实仔细思考就是row=0,row=numRows-1时,row应该做什么的问题。
row的两个状态可以用高中物理中的“临界状态”理解。


class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2){
            return s;
        }
        List<StringBuilder> list = new ArrayList<StringBuilder>();
        for(int i = 0;i < Math.min(numRows,s.length());i++){//结合实际情况,可能会有row>s.length()和row小于的情况,空间没必要浪费
            list.add(new StringBuilder());
        }
        char[] ch = s.toCharArray();
        int row = 0;
        boolean flag = false;
        for(char c : ch){//这里row可以用二维数组row和col的定位方式来理解,只是list这种方式不用col来定位。
            list.get(row).append(c);
            if(row == 0){
                flag = true;
            }
            if(row == numRows-1){
                flag = false;
            }
            if(flag){
                row++;
            }else{
                row--;
            }
        }
        StringBuilder sB = new StringBuilder();
        for(StringBuilder sb : list){
            sB.append(sb);
        }
        return sB.toString();
    }
}

结果:

耗时6ms

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值