【剑斩OFFER】算法的暴力美学——Z字行变换

一、题目描述

二、算法原理

我们可以从字符串的下标表示来寻找题目的规律:

第一行:0 到 4 之间隔着 d = 2 * numrows - 2,相当于数学里面的等差数列的差值 d ,所以:当 i = 0 时,i、i + d、i + 2d、i + 3d 。。。。。i + kd 来表示第一行的取值。

最后一行:其实和第一行一样,i + d 、i + 2d 、i + 3d ......... i + kd 来表示最后一行的取值

中间行:我们把前两个为一组,因为 i + d 求出来的值和第一行和最后一行的求法一样,但是 i + d 前面那个数得 d - i,所以规律为:(i,d - i)、(i + d,2d - i )、(i + 2d,3d - i ).........( i + kd, (k - 1)d - i)。

注意:要注意越界问题,特别是中间行。

三、代码实现

cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1) return s;
        string ret;
        int d = 2 * numRows - 2;
        
        for (int i = 0; i < numRows; i++)
        {
            if(i == 0 || i == numRows - 1)//处理第一行和最后一行
            {
                for(int k = i; k < s.size(); k += d) ret += s[k];
            }
            else//中间
            {
                int tmp = d - i;
                for(int j = i; j < s.size();j += d)
                {
                    ret += s[j];
                    if(tmp < s.size())//防溢出
                    {
                        ret += s[tmp];
                        tmp += d;
                    }
                }
            }
        }
        return ret;
    }
};
相关推荐
leobertlan8 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的9 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1239 小时前
答案daanC语言
数据结构·算法
小 黄 鸡9 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
Navigator_Z11 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔13 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔13 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生13 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川13 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法