55. 右旋字符串(卡码网KamaCoder)

文章目录

  • 55. 右旋字符串
    • 题目描述
    • 暴力
    • 优化:不能申请额外空间,只能在本串上操作
      • 思路
      • 代码

55. 右旋字符串

题目描述

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

例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例

2
abcdefg

输出示例

fgabcde

提示信息

数据范围:
1 <= k < 10000,
1 <= s.length < 10000;

暴力

程序首先通过 cin 读取用户输入的旋转位数 n 和字符串 s。然后,它通过两个循环构造右旋转后的字符串 a:

  1. 第一个循环从字符串 s 中取出最后 n 个字符,这是因为右旋转操作的定义是将字符串尾部的若干字符移到字符串的前面。

  2. 第二个循环取出字符串 s 开头到指定位置 s.size() - n 的字符,即除去被旋转到前面的那部分字符。

最后,程序输出构造好的字符串 a 并结束。

// 包含C++的全局库,包含了大部分常用的C++库。
#include<bits/stdc++.h>
using namespace std;int main()
{int n; // 定义一个整数n,用来存储用户输入的旋转位数。string s, a; // 定义两个字符串,s用来接收用户输入的原始字符串,a用来存储旋转后的字符串。cin >> n >> s; // 从标准输入读取旋转位数和需要旋转的字符串。// 遍历并添加字符串s尾部的n个字符到字符串a。for(int i = s.size() - n; i < s.size(); i++)a += s[i];// 遍历并添加字符串s除去尾部n个字符的剩余部分到字符串a。for(int i = 0; i < s.size() - n; i++)a += s[i];// 输出旋转后的字符串a。cout << a << endl;// 程序正常结束返回0。return 0;
}

优化:不能申请额外空间,只能在本串上操作

思路

不能使用额外空间的话,模拟在本串操作要实现右旋转字符串的功能还是有点困难的。

那么我们可以想一下上一题目 151. 反转字符串中的单词 中讲过,使用整体反转+局部反转就可以实现反转单词顺序的目的。

本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度)
在这里插入图片描述
右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。如图:
在这里插入图片描述
此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如果:
在这里插入图片描述
其实,思路就是 通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。

代码

这个程序利用了反转操作(reverse 函数)的性质来实现字符串的右旋转。这种方法的核心在于:

  1. 反转整个字符串:将整个字符串 s 反转后,原来在尾部的k个字符现在会移到字符串的前面。

  2. 反转字符串的前 n 个字符:这将刚才移到前面的 n 个字符再次反转回它们原来的顺序。

  3. 反转字符串的剩余部分:将前 n 个字符之后的部分再次反转,这样这部分字符也回到了它们原来的顺序。

通过上述步骤,字符串的后 n 个字符被移动到了字符串的前面,实现了字符串的右旋转操作。

// 包含了大部分常用的C++库,简化了头文件的包含过程。
#include<bits/stdc++.h>
using namespace std;int main()
{int n; // 定义一个整数n,用来存储用户输入的旋转位数。string s; // 定义一个字符串s,用来接收用户输入的原始字符串。cin >> n >> s; // 从标准输入读取旋转位数和需要旋转的字符串。// 第一步:反转整个字符串。reverse(s.begin(), s.end());// 第二步:反转字符串的前n个字符(现在这部分字符位于字符串的开头)。reverse(s.begin(), s.begin() + n);// 第三步:反转字符串的剩余部分,即从第n个字符到字符串的末尾。reverse(s.begin() + n, s.end());// 输出旋转后的字符串。cout << s << endl;// 程序正常结束返回0。return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark SQL调优实战

1、新添参数说明 // Driver和Executor内存和CPU资源相关配置 --是否开启executor动态分配&#xff0c;开启时spark.executor.instances不生效 spark.dynamicAllocation.enabledfalse --配置Driver内存 spark.dirver.memory5g --driver最大结果大小&#xff0c;设置为0代…

SQLserver2008 r2 下载安装配置、使用、新建登录用户及通过Navicat远程连接

目录 一、下载 二、安装配置 1.安装 2.许可条款 3.安装程序支持文件 4.功能选择 5.实例配置 6.服务器配置 7.数据库引擎配置 8.Reporting Services 配置 9.安装进度 ​编辑 10.完成 三、使用 四、新建登录用户 1.新建登录名 2.常规 3.服务器角色 4. 用户映…

08 - python操作mysql

认识pymysql 借助pymysql模块&#xff0c;这是一个python编写的MYSQL驱动程序&#xff0c;借助它来操作数据库。 操作数据库的流程和java 使用原生的JDBC操作数据的流程步骤差不多。 安装pymysql pip install pymysql 操作步骤 导入pymysql模块 import pymysql创建数据库…

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

Java设计模式大全:23种常见的设计模式详解(一)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

将程序做成系统服务 shell脚本

要将程序做成系统服务&#xff0c;你可以使用Shell脚本来创建一个systemd服务单元文件。下面是一个示例的Shell脚本&#xff0c;用于创建一个名为my_service的服务单元文件&#xff1a; #!/bin/bash# 定义服务的名称和描述 SERVICE_NAME"my_service" DESCRIPTION&quo…

【手写数据库toadb】toadb表数据文件存储结构,创建表与插入数据在物理文件层的流程,行列混合存储新增分组文件结构介绍

12 数据库表物理存储结构 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上ta…

二进制可执行文件的常见后缀

有关二进制程序 二进制程序是一种由机器代码【机器代码是一种由计算机硬件理解和执行的低级指令集】组成的程序&#xff0c;它由计算机直接执行。二进制程序通常是由高级编程语言编译而来&#xff0c;经过编译器的处理将高级代码转换为机器代码。在不同的操作系统上&#xff0…

【Mysql】基本语法(数据操作+表结构操作)

一&#xff1a;数据操作 1.数据库&#xff08;库名&#xff09; create database 数据库名 //创建数据库 use 数据库名 //选择数据库 drop database 数据库名 //删除数据库[rootxibushuma ~]# mysql db2 -e show tables 不登录mysql 情况下&…

架构学习(四):scrapy下载中间件实现动态切换User-Agent

scrapy下载中间件实现动态与固定UserAgent 前言关卡&#xff1a;实现动态切换User-Agentscrapy设置User-Agent方式梳理User-Agent生效梳理为何选择在下载中间件中实现自定义User-Agent下载中间件 结束 前言 请求头User-Agent是比较常规的反爬手段&#xff0c;不同站点对其检测…

thinkphp6入门(17)-- 网站开发中session、cache、cookie的区别

Session&#xff08;会话&#xff09;: 定义&#xff1a; Session是一种用于在服务器端存储用户信息的机制&#xff0c;以跟踪用户的状态。 数据存储位置&#xff1a; 存储在服务器端&#xff0c;可以存在于内存、数据库或文件系统中。 生命周期&#xff1a; 存在于用户访问应…

sql——如果查到的值为空,则显示给出的默认值

mysql中使用ifnull&#xff0c;Oracle使用NVL 一&#xff0c;mysql IFNULL(expr1, expr2)IFNULL函数接受两个参数&#xff0c;如果expr1为NULL&#xff0c;则返回expr2的值&#xff0c;否则返回expr1的值。 例如&#xff0c; SELECT IFNULL(employee_salary, 0) AS salary F…

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰

AI助力农作物自动采摘,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

Dockerfile文件参数配置和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…

幸福小院小区中央空调节能改造项目

空调计费是指“中央空调计费”&#xff0c;这种技术实际上是在对水、电、煤气的基础上发展起来的对冷热能量进行计量的一种计费系统技术。 节能改造项目&#xff1a;幸福小院小区&#xff0e; 项目情况需求&#xff1a; 该项目是小区住宅用户建筑&#xff0c;根据功能分区管理…

Vue中路由的使用

目录 1 作用 2 使用方法 2.1 安装路由 2.2 创建路由并导出 2.3 在应用实例中使用vue-router 2.4 声明router-view&#xff0c;展示组件内容 2.5 页面跳转 3 补充内容-子路由 1 作用 能够按不同的访问路径&#xff0c;展示不同组件的内容。 2 使用方法 2.1 安装路由 …

问题:塑瓷后的牙冠要比完成的牙冠大() #学习方法#其他

问题&#xff1a;塑瓷后的牙冠要比完成的牙冠大&#xff08;&#xff09; A.10% B.10%-15% C.15%-20% D.20%-30% E.50% 参考答案如图所示

springboot157基于springboot的线上辅导班系统的开发与设计

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…