【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列

【优选算法必刷100题】第41-42题(模拟):Z 字形变换,外观数列

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

《Git深度解析》:版本管理实战全解

🌟心向往之行必能至


🎥Cx330🌸的简介:


前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

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++):
class Solution { public: string convert(string s, int numRows) { string ret; int d=2*numRows-2,n=s.size(); //如果n=1直接返回原字符串 if(numRows==1) return s; //处理第一行 for(int i=0;i<n;i+=d) ret+=s[i]; //处理中间行 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]; } } //处理最后一行 for(int i=numRows-1;i<n;i+=d) ret+=s[i]; return ret; } };
博主手记(字体还请见谅哈):

42. 外观数列

题目链接:

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

题目描述:

题目示例:

算法原理(模拟):
思路:

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

模拟解法代码(C++):
class Solution { public: string countAndSay(int n) { string ret="1"; for(int i=1;i<n;i++)//解释n-1次ret { string tmp; int len=ret.size(); for(int left=0,right=0;right<len;) { while(right<len&&ret[left]==ret[right]) right++; //to_string获取元素个数 tmp+=to_string(right-left)+ret[left]; left=right; } ret=tmp; } return ret; } };
博主手记(字体还请见谅哈):

总结:

结语:本文分享了两个算法题的解题思路和C++实现。首先针对"Z字形变换"问题,通过观察字符排列规律,采用周期模拟法将字符串按特定顺序重组。其次解决"外观数列"问题,通过统计连续相同字符个数生成新字符串。两题均采用模拟解法,文章以实战为导向,简洁明了地展示了从问题分析到代码落地的完整过程。

Read more

Flutter 三方库 diff_match_patch 鸿蒙文本比对拼接算法双向核心适配研判:毫秒解构海量字符差异区块建立丝滑无感知的协同编辑冲突强容错合并-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 diff_match_patch 鸿蒙文本比对拼接算法双向核心适配研判:毫秒解构海量字符差异区块建立丝滑无感知的协同编辑冲突强容错合并-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 diff_match_patch 鸿蒙文本比对拼接算法双向核心适配研判:毫秒解构海量字符差异区块建立丝滑无感知的协同编辑冲突强容错合并机制 在文本编辑器、版本控制系统或协同办公应用中,快速、精准地找出两段文字之间的差异并生成补丁(Patch)是核心能力。diff_match_patch 库基于 Google 开发的高效算法,提供了业界领先的文本处理解决方案。本文将详解该库在 OpenHarmony 环境下的适配与实战。 前言 随着鸿蒙分布式能力的不断增强,多终端设备(手机、平板、电脑)之间的文档同步与协作编辑变得愈发频繁。直接传输整段文本不仅浪费带宽,且难以处理冲突。diff_match_patch 通过计算文本的最小增量,能够大幅提升鸿蒙分布式数据通信的效率。 一、原理解析 1.1 基础概念 diff_match_patch

By Ne0inhk
【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想

半桔:个人主页  🔥 个人专栏: 《设计模式》《手撕面试算法》《C++从入门到入土》 🔖恐惧囚禁人的灵魂,希望可以让你自由。《肖申克的救赎》 文章目录 * 一. 光头强转行 * 1.1 团结屯的故事 * 1.2 新工作,新需求 * 二. 光头强的OO天赋 * 三. 李老板的新需求 * 3.1 出大问题了 * 3.2 继承可能不是答案 * 四. 最终方案 * 五. 总结 一. 光头强转行 1.1 团结屯的故事 我是光头强。以前,我每天的生活就是被两头臭狗熊按在地上摩擦,不仅树砍不到,还要承受李老板的夺命连环Call和扣工资威胁。 直到有一天,我捡到了一本《C++ Primer》(虽然我也忘了森林里为啥会有这书)。那一刻,

By Ne0inhk
解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题 * 视频地址 * 🌟 引言 * 🔍 问题描述 * 🧠 解题思路回顾 * 快慢指针算法 * 数学原理 * 💻 C++代码实现 * 🛠 代码解析 * 数据结构定义 * 算法实现细节 * 🚀 性能分析 * 🐞 常见问题与调试 * 常见错误 * 调试技巧 * 📊 复杂度对比表 * 🌈 总结 视频地址 因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址 🌟 引言 链表环检测问题在C++中同样是一个经典面试题。本文将用C++实现LeetCode 142题"环形链表II"的解决方案,深入讲解快慢指针算法的原理和实现细节。 🔍 问题描述 给定一个链表的头节点 head,返回链表开始入环的第一个节点。如果链表无环,则返回 nullptr。 🧠 解题思路回顾 快慢指针算法 1. 使用两个指针:slow每次走一步,fast每次走两步 2.

By Ne0inhk
【数据结构】`unordered_map` 和 `unordered_set` 的底层原理

【数据结构】`unordered_map` 和 `unordered_set` 的底层原理

unordered_map 和 unordered_set 是 C++ 标准库中的两个容器,它们被广泛应用于需要快速查找的场景中。它们的查找、插入和删除的平均时间复杂度都是 O(1),这也是它们的一个重要特性。本文将详细介绍 unordered_map 和 unordered_set 的底层原理,帮助计算机专业的小白理解什么是哈希、桶以及为什么它们的查找效率如此之高。 本篇文章需要有unordered_map、unordered_set、vector等的基础,若不清楚,建议先去了解后再来阅读【编程语言】在C++中使用map与unordered_map【编程语言】C++ 新手指南:如何使用 set 和 unordered_set【编程语言】C++ 中 vector 的常用操作方法【数据结构】链表详解:数据节点的链接原理【

By Ne0inhk