算法练习-右旋字符串(思路+流程图+代码)

2024-01-21 12:52

本文主要是介绍算法练习-右旋字符串(思路+流程图+代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

难度参考

        难度:简单

        分类:字符串

        难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。

题目

        字符串的【右旋转】操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串s和一个 正整数k,请编写一个函数,将字符串中的后面k个字符移到字符串的前面,实现字符串的【右旋转】操作。

        示例:

        输入:s="abcdefg",k=2

        输出:"fgabcde"

        解释:k=2,所以将字符串s尾的两个字符移动到字符串的开头

        额外要求: 不能申请额外空间,只能在字符串s上操作。

思路

        题目要求实现字符串的右旋转操作,即将字符串尾部的若干个字符移动到字符串的前面。同时,要求不能申请额外空间,只能在字符串上操作。

  1. 先整体反转整个字符串。
  2. 再分别反转前 k 个字符和剩余的字符。

详细步骤

  1. 使用一个辅助函数 reverseString,该函数接收一个字符串和两个索引参数,将这两个索引之间的子串进行反转。
  2. 主函数 rotateString 中,首先计算实际需要旋转的步数 k(防止 k 大于字符串长度),然后执行以下步骤:
    • 反转整个字符串。
    • 反转前 k 个字符。
    • 反转剩余的字符。

示例

        输入:s="abcdefg", k=2

  1. 整体反转整个字符串:

    • 反转前:"abcdefg"
    • 反转后:"gfedcba"
  2. 反转前 k 个字符:

    • 反转前 2 个字符:"fgedcba"
  3. 反转剩余的字符:

    • 反转剩余的字符:"fgabcde"

        最终的输出结果为:"fgabcde"

梳理

        让我们仔细解释一下为什么这样的算法能够实现字符串的右旋转操作。

        首先,整体思路涉及三个关键步骤,以实现字符串的右旋转。这三个步骤是相互关联的,确保最终结果正确。以下是对每个步骤的详细解释:

  1. 整体反转整个字符串: 这一步的目的是将字符串的尾部移到前面,实现了一部分右旋转。例如,"abcdefg" 反转后变为 "gfedcba"。
  2. 反转前 k 个字符: 接下来,反转字符串的前 k 个字符。这一步的目的是将之前移动到开头的尾部字符重新移到字符串的尾部。在上面的例子中,反转前 2 个字符后得到 "fgedcba"。
  3. 反转剩余的字符: 最后,反转剩余的字符。这一步确保整个字符串的顺序正确,实现了右旋转。在上面的例子中,反转剩余字符后得到最终结果 "fgabcde"。

        具体的来说就是,

  • 整体反转整个字符串实现了尾部字符移到前面的效果。
  • 反转前 k 个字符确保之前移到前面的尾部字符重新回到了字符串的尾部。
  • 反转剩余的字符则确保整个字符串的顺序正确,最终实现了右旋转的操作。

        这样的操作保证了在不使用额外空间的情况下,通过原地操作字符串,实现了字符串的右旋转。这个算法的核心在于巧妙地利用字符串反转的特性,以及在合适的步骤中进行反转,最终得到期望的结果。

代码

#include <iostream>
#include <algorithm>using namespace std;// 反转字符串的子函数,反转字符串 s 中从索引 start 到索引 end 的部分
void reverseString(string& s, int start, int end) {while (start < end) {swap(s[start], s[end]);  // 使用 swap 函数交换字符start++;end--;}
}// 右旋转字符串的主函数
void rotateString(string& s, int k) {int n = s.length();k = k % n;  // 处理 k 大于字符串长度的情况,确保 k 在有效范围内// 步骤1:反转整个字符串reverseString(s, 0, n - 1);// 步骤2:反转前 k 个字符reverseString(s, 0, k - 1);// 步骤3:反转剩余的字符reverseString(s, k, n - 1);
}int main() {string s = "abcdefg";int k = 2;// 调用右旋转函数rotateString(s, k);// 输出结果cout << "输出:" << s << endl;return 0;
}

打卡

这篇关于算法练习-右旋字符串(思路+流程图+代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/629622

相关文章

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -