【剑斩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;
    }
};
相关推荐
少许极端2 分钟前
算法奇妙屋(二十八)-递归、回溯与剪枝的综合问题 1
java·算法·深度优先·剪枝·回溯·递归
仰泳的熊猫3 分钟前
题目1453:蓝桥杯历届试题-翻硬币
数据结构·c++·算法·蓝桥杯
唐梓航-求职中3 分钟前
技术-算法-leetcode-1606. 找到处理最多请求的服务器(易懂版)
服务器·算法·leetcode
啊阿狸不会拉杆4 分钟前
《机器学习导论》第 10 章-线性判别式
人工智能·python·算法·机器学习·numpy·lda·线性判别式
会叫的恐龙6 分钟前
C++ 核心知识点汇总(第11日)(排序算法)
c++·算法·排序算法
twilight_4696 分钟前
机器学习与模式识别——线性回归算法
算法·机器学习·线性回归
玄同76513 分钟前
Python Random 模块深度解析:从基础 API 到 AI / 大模型工程化实践
人工智能·笔记·python·学习·算法·语言模型·llm
Pluchon16 分钟前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法
独断万古他化21 分钟前
【算法通关】前缀和:和为 K、和被 K整除、连续数组、矩阵区域和全解
算法·前缀和·矩阵·哈希表
历程里程碑23 分钟前
普通数组-----除了自身以外数组的乘积
大数据·javascript·python·算法·elasticsearch·搜索引擎·flask