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

这篇具有很好参考价值的文章主要介绍了算法练习-右旋字符串(思路+流程图+代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

难度参考

        难度:简单

        分类:字符串

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

题目

        字符串的【右旋转】操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串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;
}

打卡

算法练习-右旋字符串(思路+流程图+代码),算法编程笔记,算法文章来源地址https://www.toymoban.com/news/detail-816191.html

到了这里,关于算法练习-右旋字符串(思路+流程图+代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法练习-赎金信(思路+流程图+代码)

            难度:中等         分类:哈希表         难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨在督促自己认真学习。         给你

    2024年02月22日
    浏览(47)
  • 算法练习-长度最小的子数组(思路+流程图+代码)

            难度:简单         分类:数组         难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。         给定一个含有个正整数的数组和一个正整数s,找出该数组中满足其和

    2024年01月18日
    浏览(45)
  • Python练习分割字符串

     

    2024年02月09日
    浏览(43)
  • Java中的String字符串练习

    目录 Java中的String字符串练习 01-用户登录 02-遍历字符串并统计字符个数 03-字符串拼接 04-字符串反转 注意点 05-金额转化(简单) 代码解释: 06-手机号屏蔽 07-身份证号码查看 易错点: 08-敏感词替换 注意点 toCharArray() 是Java中的一个方法,它用于将字符串转换为字符数组。 方法签

    2024年03月28日
    浏览(65)
  • 【C】逆序字符串(俩种递归思路)

    ✨ 博客主页: XIN-XIANG荣 ✨ 系列专栏: 【从0到1,C语言学习】 ✨ 一句短话: 你若盛开,蝴蝶自来! ✨ 博客说明: 尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上的伙伴,文章中如果发现错误及不足之处,还望在评论区

    2024年02月12日
    浏览(39)
  • 【C语言练习】字符串旋转你会嘛?

    实现一个函数,可以左旋字符串中的k个字符。例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB  要左旋 k 个字符,我们首先应该考虑左旋 1 1 1 个字符怎么做。左旋一个字符分为以下的三步: 取出字符串中最左边的一个字符 将字符串中剩下的字符按从左到右的顺序

    2024年02月10日
    浏览(34)
  • JAVA刷题之字符串的一些个人思路

    感谢您的阅读! ꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶ 个人

    2024年02月05日
    浏览(40)
  • 练习题 替换子串得到平衡字符串

    题目 有一个只含有  \\\'Q\\\', \\\'W\\\', \\\'E\\\', \\\'R\\\'  四种字符,且长度为  n  的字符串。 假如在该字符串中,这四个字符都恰好出现  n/4  次,那么它就是一个「平衡字符串」。 给你一个这样的字符串  s ,请通过「替换一个 子串 」的方式,使原字符串  s  变成一个「平衡字符串」。

    2024年01月18日
    浏览(54)
  • 【C++ OJ练习】5.字符串最后一个单词的长度

    字符串最后一个单词的长度_牛客题霸_牛客网 倒着找第一个空格的下标 用下标之间的差来计算  【C++ OJ练习】5.字符串最后一个单词的长度 完

    2024年02月13日
    浏览(63)
  • C语言倒置字符串练习题(三步翻转法)

    题目描述: 将一句话的单词进行倒置,标点不倒置。比如 I like beijing.,经过函数后变为:beijing. like I 代码(含注解): 运行结果:

    2024年01月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包