leetcode 6 Z字形变化/zigzag

题目描述:

《leetcode 6 Z字形变化/zigzag》

刚开始看到题目半天没看懂什么意思,后来查了查才理解题意,就是叫你把字符串按照图中从上到下从左到右(z字形)摆放,然后再按行读出来摆放后的字符串是什么。

解题思路:观察到Z字形排列的第一行为等差数列,考虑从第一行入手,第二行的坐标分别为第一行每个字符的坐标 -1 或者 +1,第三行的坐标分别为第一行每个字符的坐标 -2 或者 +2 。。。依次类推,通过此思路进行模拟。

代码如下:(不知道能不能看懂。。写的比较乱,这题改了很久)

class Solution {
public:
    
    string convert(string s, int numRows) {// 模得神志不清系列
        int n = s.size();
        string t = "";
        int dis = numRows*2 - 2; // 第一行每个字符和下个字符的坐标之差
        int gap = 0; // 第n行字符和第一行字符坐标差,第一行为0,第二行为1,第三行为2。。。依次类推
        int tar = 0; //工作坐标
        if(numRows == 1) return s;
        if(numRows > n) numRows = n; //处理错误输入
        if(numRows == n) return s;
        for(gap = 0 ;gap < numRows ;gap++){  // 外循环表示从第一行处理到最后一行            
            for(tar = 0;tar < n + dis;tar += dis){ //内循环:处理每行每个字符
                if(gap == 0){ //第一行
                    if(tar < n && tar >= 0){
                        t += s[tar];
                    }
                }
                if(gap > 0 && gap < numRows - 1){ //第二行到倒数第二行
                    if( tar - gap >= 0 && tar - gap < n){// 边界判断
                        t += s[tar - gap]; // 处理左边元素
                    }
                    if( tar + gap < n && tar + gap >= 0){// 边界判断
                        t += s[tar + gap]; // 处理右边元素
                    }
                }
                if (gap == numRows - 1 ){// 最后一行
                    if(tar > 0){
                    if(tar - gap < n && tar - gap >= 0){
                        t += s[tar - gap]; //只处理左边
                    }
                    }
                }
            }
        }
        return t;
    }
};

    原文作者:Z字形编排问题
    原文地址: https://blog.csdn.net/twt727/article/details/79992114
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞