当前位置: 首页 > news >正文

算法的学习笔记—左旋转字符串(牛客JZ58)

在这里插入图片描述

img

😀前言
在程序设计中,字符串处理问题屡见不鲜,其中“字符串左旋”是一种常见操作,今天我们一起来探讨一个经典的左旋转字符串题目,以及一种优雅的解决方案——三步翻转法

🏠个人主页:尘觉主页

文章目录

  • 🥰左旋转字符串
    • 题目链接
    • 💝题目描述
    • 💞分析与思路
      • 举例说明
    • 💞代码实现
      • 代码详解
    • 复杂度分析
    • 😄总结

🥰左旋转字符串

题目链接

牛客网

💝题目描述

题目要求将给定字符串 SSS 从第 KKK 个位置分割为两个子串并互换位置。例如:

  • 输入S = "abcXYZdef"K = 3
  • 输出"XYZdefabc"

解题的关键在于实现有效的字符串左旋,即将字符串的前 KKK 个字符移到末尾,形成新的字符串。

💞分析与思路

左旋转字符串可以通过切分字符串并拼接两部分的方式实现,但这种方法可能会导致大量的内存复制。三步翻转法是一种更加高效的方式,仅需对字符数组进行三次局部翻转即可完成目标操作:

  1. 将前 KKK 个字符翻转。
  2. 将剩余字符翻转。
  3. 最后对整个字符串再翻转一次。

举例说明

S = "abcXYZdef"K = 3 为例:

  1. 第一步:翻转前 3 个字符 abc,得到 cbaXYZdef
  2. 第二步:翻转后续字符 XYZdef,得到 cbaZYXfed
  3. 第三步:将整个字符串翻转,得到 XYZdefabc,即我们期望的结果。

💞代码实现

接下来,我们使用 Java 语言实现三步翻转法。此算法时间复杂度为 O(n),仅需常数级的额外空间,因此在性能和空间占用上都表现优异。

public class Solution {public String LeftRotateString(String str, int n) {// 边界条件检查if (str == null || n >= str.length()) {return str;}// 转换为字符数组,方便操作char[] chars = str.toCharArray();// 第一步:翻转前 n 个字符reverse(chars, 0, n - 1);// 第二步:翻转后面的字符reverse(chars, n, chars.length - 1);// 第三步:将整个字符串翻转reverse(chars, 0, chars.length - 1);return new String(chars);}// 辅助函数:翻转指定区间的字符private void reverse(char[] chars, int i, int j) {while (i < j) {swap(chars, i++, j--);}}// 辅助函数:交换字符数组的两个元素private void swap(char[] chars, int i, int j) {char t = chars[i];chars[i] = chars[j];chars[j] = t;}
}

代码详解

  • reverse函数:负责翻转字符数组中某个指定区间的字符。
  • swap函数:用于交换字符数组中的两个字符。

通过这些辅助函数,我们只需 3 步完成了字符串的左旋转操作。

复杂度分析

  • 时间复杂度:三次翻转,每次 O(n)O(n)O(n),因此总时间复杂度为 O(n)O(n)O(n)。
  • 空间复杂度:操作在原字符串的字符数组上进行,因此空间复杂度为 O(1)O(1)O(1)。

😄总结

在这道题目中,使用三步翻转法避免了直接拼接带来的额外开销,使得操作更加高效简洁。无论是面试还是实际开发中,这种方法都非常实用。

这个题目很好地锻炼了对字符串操作和数组翻转的理解,三步翻转法的思路在其他字符串旋转、数组循环移位等问题中也能得到广泛应用。希望这篇文章能帮助大家掌握并熟练应用这种方法。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

相关文章:

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…...

Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM

文章目录 问题描述驱动下载地址问题解决&#xff1a;安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以&#xff0c;但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…...

ios 项目升级极光SDK

由于项目使用的是旧版本&#xff0c;隐私合规检查不通过&#xff0c;需要升级到最新版本&#xff0c; 使用cocoapods集成无法正常运行&#xff0c;.a文件找不到&#xff0c;可能项目比较久了&#xff0c;最好选择手动导入 下载最新版本SDK&#xff0c;将 SDK 包解压&#xff…...

【Java】java | logback日志配置 | 按包配置级别

一、概述 日志配置需求&#xff1a; 本地部分包开debug&#xff0c;其他路径走配置&#xff1b;只在本地环境有效 二、logback.xml配置 <!--本地调试&#xff0c;开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…...

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找打Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…...

Spring框架原理面试题及参考答案

目录 什么是Spring 开发框架? 说说Spring 的 IOC 和 DI? 简述IoC(控制反转)及在 Spring 中的实现 说说Spring IOC 容器的基本概念? 说说Spring IoC 的实现机制? 说说Spring IoC 容器? 简述Spring ApplicationContext 说说Spring Bean 的生命周期 说说在 Spring…...

Java类的static成员以及代码块(详细版)

文章目录 一、什么是static成员二、static修饰的成员有何意义三、static修饰成员变量四、static修饰成员方法4.1、静态成员变量不可以在方法内创建4.2、静态成员方法内部不可以访问非静态成员变量4.3、总结 五、static成员变量的初始化5.1、就地初始化5.2、静态代码块初始化 六…...

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch &#xff0c;例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版&#xff0c;但我们只测…...

本地Docker部署开源WAF雷池并实现异地远程登录管理界面

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

性能需求笔记

名称解释 系统用户&#xff1a;所有注册过的用户&#xff1b;在线用户&#xff1a;某时间段内登录且在线的用户 pv&#xff1a;用户浏览页面的次数 UV&#xff1a;登录系统的用户&#xff0c;uv课产生多个pv 性能测试&#xff1a;测试软件在系统中的运行性能&#xff0c;度量系…...

ts:数组的常用方法(reduce累加)

ts&#xff1a;数组的常用方法&#xff08;reduce累加&#xff09; 一、主要内容说明二、例子reduce方法&#xff08;累加&#xff09;1.源码1 &#xff08;reduce方法&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的reduce方法&#xff0c;用…...

Begin

cpp 编程的发展方向还是很多的&#xff1a;游戏、嵌入式、QT、客户端、服务端、机器学习、算法大模 型 ...&#xff0c;现阶段还是不太清楚具体想走什么方向。主QT编程应该是不在考虑之内的&#xff0c;可以为辅简单 学习一下&#xff1b;游戏方向&#xff1a;需要学习lua语言…...

【实战案例】Django框架表单处理及数据库交互

本文基于之前内容列表如下&#xff1a; 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…...

python开发工具是选择vscode还是pycharm?两款软件优缺点对照!

Pycharm和VSCode是两款流行的代码编辑器&#xff0c;它们都有各自的优缺点和适用情况。本文将从以下几个方面对它们进行比较和分析&#xff1a; 功能和扩展性性能和稳定性用户体验和界面价格和支持 功能和扩展性 Pycharm是一款专为Python开发而设计的集成开发环境&#xff08;…...

2025选题|基于Hadoop的物品租赁系统的设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

【Qt】QTableView添加下拉框过滤条件

实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…...

从可逆计算看低代码

2020年低代码&#xff08;LowCode&#xff09;这一buzzword频繁亮相于主流技术媒体&#xff0c;大背景下是微软/亚马逊/阿里/华为等巨头纷纷入场&#xff0c;推出自己的相应产品。一时之间&#xff0c;大大小小的技术山头&#xff0c;无论自己原先是搞OA/ERP/IOT/AI的&#xff…...

设计模式最佳实践代码总结 - 结构型设计模式篇 - 侨接设计模式最佳实践

目录 侨接设计模式最佳实践 侨接设计模式最佳实践 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立地变化。…...

【软件测试】python——Unittest

UnitTest 框架 笔记来自于黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例。链接&#xff1a;[黑马程序员python自动化测试教程&#xff0c;python从基础到Uinttest框架管理测试用例](https://www.bilibili.com/video/BV1av411q7dT?spm_i…...

Cadence AMS Designer 保姆级教程:手把手教你搞定数模混合仿真(含Verilog模块导入避坑指南)

Cadence AMS Designer 保姆级教程&#xff1a;手把手教你搞定数模混合仿真&#xff08;含Verilog模块导入避坑指南&#xff09; 数模混合仿真一直是芯片设计中的关键环节&#xff0c;尤其对于刚接触Cadence环境的新手工程师或在校学生来说&#xff0c;从零开始搭建混合仿真环境…...

Windows下MIT Kerberos Ticket Manager从安装到实战:一键Keytab登录与票据管理保姆教程

Windows下MIT Kerberos Ticket Manager从安装到实战&#xff1a;一键Keytab登录与票据管理保姆教程 在企业级IT环境中&#xff0c;Kerberos认证是保障系统安全的重要机制。但对于需要频繁进行认证操作的开发者和运维人员来说&#xff0c;反复输入密码不仅效率低下&#xff0c;还…...

用Logisim搞定Educoder实训:从数码管驱动到完整交通灯系统的保姆级通关攻略

Logisim实战&#xff1a;从数码管驱动到交通灯系统的Educoder通关全解析 第一次打开Educoder平台的《交通灯系统设计》实训项目时&#xff0c;我和大多数同学一样&#xff0c;面对十二个关卡的层层递进有些手足无措。经过三个通宵的调试和无数次的电路重构&#xff0c;终于摸索…...

魔方机器人(二)从定点采样到序列生成:OpenCV颜色识别的工程实践

1. 魔方机器人颜色识别的工程挑战 第一次尝试用摄像头识别魔方颜色时&#xff0c;我对着屏幕上闪烁的色块发呆了整整三天。明明肉眼能清晰分辨的红色和橙色&#xff0c;在程序里却总是混淆。这就是魔方机器人开发中最关键的环节——颜色识别的工程化实现&#xff0c;它直接决定…...

5分钟免费获取网易云音乐无损FLAC:终极批量下载工具完全指南

5分钟免费获取网易云音乐无损FLAC&#xff1a;终极批量下载工具完全指南 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为无法离线享受高品质音乐…...

如何快速集成KYGooeyMenu:iOS粘液菜单的完整实现指南

如何快速集成KYGooeyMenu&#xff1a;iOS粘液菜单的完整实现指南 【免费下载链接】KYGooeyMenu A not bad gooey effects menu. 项目地址: https://gitcode.com/gh_mirrors/ky/KYGooeyMenu KYGooeyMenu是一款为iOS应用打造的粘液效果菜单组件&#xff0c;能为你的应用添…...

终极跨平台音频下载解决方案:喜马拉雅FM批量下载器完整指南

终极跨平台音频下载解决方案&#xff1a;喜马拉雅FM批量下载器完整指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否经常…...

从LightDM到DWM:打造轻量级Linux桌面启动链

1. 为什么选择LightDMDWM组合 如果你正在寻找一个既轻量又高度可定制的Linux桌面环境&#xff0c;LightDM搭配DWM的组合绝对值得考虑。我用了整整三个月时间测试各种显示管理器和窗口管理器的搭配&#xff0c;最终发现这套方案在资源占用和操作效率上达到了完美平衡。 先说说Li…...

Node.js异步数据库操作:nedb-promises封装原理与实战指南

1. 项目概述&#xff1a;告别回调地狱&#xff0c;拥抱异步数据库操作 如果你在Node.js项目中用过NeDB&#xff0c;大概率对它的回调函数&#xff08;callback&#xff09;模式又爱又恨。NeDB本身是一个轻量级的嵌入式数据库&#xff0c;API设计简单直观&#xff0c;但在现代异…...

行为准则主题钓鱼攻击机理与 AiTM 防御体系研究

摘要 2026 年 5 月&#xff0c;微软安全部门发布预警&#xff0c;披露一类以行为准则审查为伪装的大规模钓鱼攻击活动。该攻击依托高度仿真的企业合规通知邮件&#xff0c;诱导员工访问恶意登录页面&#xff0c;采用对手中间人&#xff08;AiTM&#xff09; 技术窃取账号凭据与…...