【C++经典例题】字符串特定规则反转问题的解法

【C++经典例题】字符串特定规则反转问题的解法
           💓 博客主页:倔强的石头的ZEEKLOG主页 

           📝Gitee主页:
倔强的石头的gitee主页

            ⏩ 文章专栏:C++经典例题

                                  期待您的关注



目录

问题描述

解题思路

代码实现

复杂度分析


问题描述

在字符串处理的编程领域中,经常会遇到各种复杂的规则要求。

本文将深入探讨一个给定字符串 s 和整数 k,按照特定规则反转字符串的问题

要求从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符

  • 如果剩余字符少于 k 个,则将剩余字符全部反转;
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样

原题链接

541. 反转字符串 II - 力扣(LeetCode)

解题思路

  1. 区间划分:解题的核心在于将字符串按照每 2k 个字符为一个区间进行划分。通过双指针的方式,定义一个左指针 left 来标记每个区间的起始位置,初始时 left 指向字符串的开头 s.begin()。
  2. 确定右边界:对于每个 2k 区间,需要确定其右边界 right。如果当前区间有足够的字符,即 left + 2*k 小于字符串的末尾 s.end(),那么右边界 right 就是 left + 2*k;否则,右边界 right 就是字符串的末尾 s.end()。这一步是为了确定一个2k区间
  3. 确定实际反转的右边界:在每个 2k 区间内,需要进一步确定实际反转的右边界 rightend。如果从 left 开始往后数 k 个字符不超过字符串末尾,即 (left + k) < s.end(),那么实际反转的右边界 rightend 就是 left + k;否则,实际反转的右边界 rightend 就是字符串的末尾 s.end()。这一步是为了满足题目中关于剩余字符数量不同时的反转规则
  4. 反转操作:确定了实际反转的左右边界后,使用 reverse 函数对 [left, rightend) 区间内的字符进行反转。
  5. 移动指针:完成一个区间的处理后,将左指针 left 移动到当前右边界 right 的位置,以便处理下一个 2k 区间。重复上述步骤,直到左指针 left 到达字符串的末尾。

代码实现

class Solution { public: string reverseStr(string s, int k) { string::iterator left = s.begin();//初始左区间 while(left < s.end()) { //初始右区间 string::iterator right = (left + 2*k )< s.end() ? left+ 2*k : s.end(); //确定右区间的实际值 //剩余数量小于k,就全部反转;剩下数量大于k,就反转前k string::iterator rightend =(left + k)<s.end() ? (left + k) : s.end(); reverse(left,rightend); //移动 left = right; } return s; } };
  1. 初始化左指针:string::iterator left = s.begin(); 这行代码初始化了左指针 left,使其指向字符串 s 的开头。
  2. 循环处理区间:while(left < s.end()) 循环用于遍历整个字符串,只要左指针 left 还未到达字符串末尾,就继续处理下一个 2k 区间。
  3. 确定右边界:string::iterator right = (left + 2*k )< s.end()? left+ 2*k : s.end(); 这行代码根据当前 left 的位置和 2k 的长度,确定了当前 2k 区间的右边界 right。
  4. 确定实际反转的右边界:string::iterator rightend =(left + k)<s.end()? (left + k) : s.end(); 这行代码根据当前 left 的位置和 k 的长度,确定了实际需要反转的右边界 rightend。
  5. 反转操作:reverse(left,rightend); 这行代码调用 reverse 函数,对 [left, rightend) 区间内的字符进行反转。
  6. 移动左指针:left = right; 这行代码将左指针 left 移动到当前右边界 right 的位置,为处理下一个 2k 区间做准备。

复杂度分析

  1. 时间复杂度:由于每个字符最多被处理一次,所以时间复杂度为 O(n),其中 n 是字符串的长度
  2. 空间复杂度:代码中只使用了常数级别的额外空间,如指针 left、right 和 rightend,所以空间复杂度为 O(1)

通过上述解题思路和代码实现,我们可以高效地解决这个字符串特定规则反转的问题。这种方法不仅逻辑清晰,而且在时间和空间复杂度上都达到了较好的性能。

Read more

开源神器Cua登场:让AI替你操作电脑,告别重复劳动

开源神器Cua登场:让AI替你操作电脑,告别重复劳动

最近在GitHub上发现了一个非常有意思的开源项目,叫做Cua(读作"koo-ah"),这可能是我见过的最具革命性的AI自动化框架了。想象一下,如果AI能像人一样"看"屏幕,理解界面内容,然后自主操作电脑,那会是什么样的体验?Cua就是为了实现这个梦想而诞生的。 作为一个长期关注自动化工具的人,我必须说,传统的自动化方案都有一个致命弱点:太脆弱了。稍微改个UI布局,整个脚本就废了。但Cua完全不同,它让AI直接"看"屏幕,就像人一样理解界面,这种全新的思路真的让人眼前一亮。 什么是Computer-Use Agents 在正式介绍Cua之前,我们先聊聊什么是Computer-Use Agents(计算机使用代理,简称CUA)。简单来说,这是一种全新的AI系统,能够像人一样通过视觉理解和动作执行来自主操作计算机界面。 传统的自动化工具通常依赖于脆弱的CSS选择器、元素ID或者API接口。一旦网页或应用更新了界面,这些工具就彻底失效了。我相信很多写过网页爬虫或者UI自动化脚本的朋友都深有体感,维护成本简直是噩梦。 但CUA完全不同,它使用视觉语言模型来感知屏幕内容,就像人一样

By Ne0inhk

Faster Whisper语音识别终极指南:4倍速度的转录神器

Faster Whisper语音识别是OpenAI Whisper模型的高效重实现,基于CTranslate2推理引擎,为音频转录带来革命性的速度提升和内存优化。这个开源项目专门为需要快速处理大量音频内容的用户设计,无论是会议记录、播客转录还是视频字幕生成,都能轻松应对。 【免费下载链接】faster-whisper 项目地址: https://gitcode.com/gh_mirrors/fas/faster-whisper 🚀 为什么选择Faster Whisper? Faster Whisper相比原版Whisper具有显著优势: 速度优势对比 | 实现方案 | 精度 | 处理时间 | 最大GPU内存 | |---------|------|----------|-------------| | OpenAI Whisper | fp16 | 4分30秒 | 11325MB | | Faster Whisper | fp16 | 54秒 | 4755MB | | Faster Whisper | int8 | 59秒 | 3091MB | 核心特性亮点: * ⚡

By Ne0inhk

GitHub访问加速终极指南:hosts配置文件完整教程

GitHub访问加速终极指南:hosts配置文件完整教程 【免费下载链接】hostsGitHub最新hosts。解决GitHub图片无法显示,加速GitHub网页浏览。 项目地址: https://gitcode.com/gh_mirrors/host/hosts 还在为GitHub图片无法加载而烦恼吗?还在忍受缓慢的GitHub页面响应速度吗?本指南将为您提供一套完整的GitHub访问加速解决方案,让您5分钟内告别网络困扰。 为什么GitHub访问如此缓慢? GitHub作为全球最大的代码托管平台,其服务器主要位于国外。由于网络环境复杂,DNS解析延迟、网络路由不佳等因素导致国内开发者访问体验极差。特别是图片资源加载失败、页面响应缓慢等问题,严重影响了开发效率。 快速配置:5分钟解决访问问题 一键获取最新hosts配置 最简单直接的方式是获取项目最新配置: git clone https://gitcode.com/gh_mirrors/host/hosts cd hosts 各系统配置步骤详解 操作系统hosts文件路径DNS刷新命令macOS/etc

By Ne0inhk

开源软件管理实战指南:从问题诊断到高效运维

开源软件管理实战指南:从问题诊断到高效运维 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 问题诊断:开源软件管理中的三大痛点 当你在终端输入./application却得到"权限被拒绝"的错误时,是否意识到这可能是开源软件管理体系缺失的信号?某科技公司开发团队曾因未验证版本哈希值,导致部署了被篡改的中间件,造成核心数据泄露;一位独立开发者花费三天时间排查兼容性问题,最终发现仅是使用了不匹配系统架构的软件版本;某高校实验室因未建立版本回滚机制,在重大实验前的软件更新后,关键设备无法正常工作。这些真实场景揭示了开源软件管理中普遍存在的安全验证缺失、版本适配混乱和应急机制不足三大核心问题。 方案设计:构建开源软件全生命周期管理体系 决策矩阵:如何精准选择软件版本? 面对琳琅满目的开源软件版本,如何做出最适合自身环境的选择?以下决策矩阵将帮助你系统分析: 评估维度优先级权重稳定版考量因素测试版考量因素历史版考量因素功能完整性30%核心功能无缺失新功能覆盖

By Ne0inhk