leetcode 6 Z字形变化/zigzag

本文介绍了一种将字符串以Z字形方式排列并按行读取的方法。通过模拟第一行字符的位置,逐步推导出其他行字符的位置,最终实现字符串的Z字形转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:


刚开始看到题目半天没看懂什么意思,后来查了查才理解题意,就是叫你把字符串按照图中从上到下从左到右(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;
    }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值