《算法闯关指南:优选算法--模拟》--41.Z 字形变换,42.外观数列


🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:


文章目录


前言:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找"最优解"。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解"局部最优"到"全局最优"的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。


41. Z 字形变换

题目链接

6. Z 字形变换 - 力扣(LeetCode)

题目描述


题目示例

解法(模拟+找规律):

算法思路:

找规律,用 row 代替行数,row = 4 时画出的 N 字形如下:

0 2row - 2 4row - 4

1 2row - 3 2row - 1 4row - 5 4row - 3

2 2row-4 2row 4row - 6 4row - 2

3 2row + 1 4row - 1

不难发现,数据是以 2row - 2 为⼀个周期进行规律变换的。将所有数替换成用周期来表示的变量:

第一行的数是:0, 2row - 2, 4row - 4;

第二行的数是:1, (2row - 2) - 1, (2row - 2) + 1, (4row - 4) - 1, (4row - 4) + 1;

第三行的数是:2, (2row - 2) - 2, (2row - 2) + 2, (4row - 4) - 2, (4row - 4) + 2;

第四行的数是:3, (2row - 2) + 3, (4row - 4) + 3。

可以观察到,第一行、第四行为差为 2row - 2 的等差数列;第二行、第三行除了第⼀个数取值为行数,每组下标为(2n - 1, 2n)的数围绕(2row - 2)的倍数左右取值。

以此规律,我们可以写出迭代算法。

C++算法代码:

cpp 复制代码
class Solution {
public:
    string convert(string s, int numRows) {
     if(numRows==1) return s;
        string ret;
        int d=2*numRows-2,n=s.size();
        //1.处理第一行
        for(int i=0;i<n;i+=d)
            ret+=s[i];
        //2.处理中间的几行
        for(int k=1;k<numRows-1;k++)
        {
            for(int i=k,j=d-k;i<n||j<n;i+=d,j+=d)
            {
                if(i<n) ret+=s[i];
                if(j<n) ret+=s[j];
            }
        }
        //3.处理最后一行
        for(int i=numRows-1;i<n;i+=d)
            ret+=s[i];

        return ret;
    }
};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:


42. 外观数列

题目链接

38. 外观数列 - 力扣(LeetCode)

题目描述:

题目示例:

解法(模拟):

算法思路:

所谓【外观数列】,其中只是依次统计字符串中连续且相同的字符的个数。依据题意,依次模拟即可。

C++算法代码:

cpp 复制代码
class Solution {
public:
    string countAndSay(int n) {
        string ret="1";
        for(int i=1;i<n;i++) // 解释 n - 1 次 ret 即可
        {
            string tmp;
            for(int left=0,right=0,count=0;right<ret.size();)
            {
                while(right<ret.size()&&ret[left]==ret[right]) right++;
                tmp+=to_string(right-left)+ret[left];
                left=right;
            }
            ret=tmp;
        }
        return ret;
    }
};

算法总结&&笔记展示:

笔记字有点丑,大家见谅:


结尾:

html 复制代码
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:本文精选了两道经典算法题进行解析: Z字形变换:通过模拟和找规律,将字符串按Z字形排列后逐行读取。核心思路是识别以2*numRows-2为周期的下标规律,分首行、中间行和末行处理。 外观数列:模拟统计连续相同字符的个数并生成新字符串。通过双指针计数,迭代n-1次得到结果。 笔记展示了手写解题思路和关键公式推导。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

相关推荐
Zenova EdgeOS3 分钟前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
huang57914718 分钟前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_40 分钟前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
君顾140 分钟前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
Elsa️7461 小时前
算法一周刷题总结
c++·算法
风合星语1 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!1 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
小小程序猴11 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途2 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
程序猿编码2 小时前
两张 3090 扛 27B:Qwen3.8-27B 大模型 DFlash2 加速版生产级落地
开发语言·gpt·深度学习·神经网络·大模型·qwen