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

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

相关文章

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满