一、前言
今天跟随卡哥刷的是网站的题(ACM模式的),感觉不是很难,对于只是翻转字符串的题目都不会太难(因为我感觉reverse就能解决大部分的问题)。话不多说,直接进入今天的题目吧。
二、题目(55. 右旋字符串(第八期模拟笔试))
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入示例
2
abcdefg
输出示例
fgabcde
三、题解
题目的描述很清楚,我对于题目的理解就是将倒数的后k个字符移到最前面即可(两端字符串内部的顺序不能改变)。移动字符串的方法一个是使用遍历循环移动,另一个是直接使用reverse函数(本题是移动到最前面可以),这样颠倒以后就是顺序从后面移动到了最前面(两者本质上是一样的时间复杂度O(n),都是遍历交换两端的元素即可)。本题使用reverse然后,再对两端字符串各自再使用reverse 将顺序颠倒回来恢复正常即可。思路和代码都是很简单的,我将代码放在下面。(唯一的注意是ACM模式,需要一个完整的程序,大家平时可以使用这个万能头库,当然我还是推荐大家弄清楚几个常用的头库保护的内容)
#include<bits/stdc++.h>//万能头库
using namespace std;
int main(){
string s;
int k;
cin>>s;
cin>>k;
reverse(s.begin(),s.end());//整体颠倒
reverse(s.begin(),s.begin()+k);//第一段颠倒恢复正常顺序
reverse(s.begin()+k,s.end());//第二段颠倒恢复正常顺序
cout<<s<<endl;
return 0;
}
示意图如下:
四、后记
多刷刷题我感觉思路会越来越清楚,只是坚持是一个很难的事情,还是阳明先生的话:知行合一,最近读了一些杂书,才发现还是王阳明说的对,他给我们指出了一条成圣的路,可是几乎没有人能够坚持从这条路走下去,那就是知行合一吧。我总是很懒,不想起来刷题,想去逃避,可是我的意识告诉我,不可以这么做,所以知行合一呀,再苦苦追求。对于本题,在允许的条件下我们使用内置的函数会很方便,那么希望自己会加油,会坚持下去!