算法刷题记录 二十四【右旋字符串】

前言

字符串篇,继续。
记录 二十四【右旋字符串】


一、题目阅读

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

输入描述

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

输出描述

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

输入示例

2
abcdefg

输出示例

fgabcde

提示

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

二、尝试实现

仍然改变字符串,但是这个题目字符串前后长度保持不变,不需要扩容或者减少长度。

思路

第一种

(1)结合二十三参考思路,可以先把整个string s进行reverse,然后再反转两部分:以第k个元素为界,前一半反转一次,后一半反转一次。得到结果。示意图如下:
在这里插入图片描述

第一种思路代码实现(测试通过)

#include <iostream>
#include <algorithm>
using namespace std;

void reverse(string& s,int start,int end){//左闭右开
    if(start > s.size()|| end < 0){
        return;
    }
    for(int i = start,j = end-1;i < j;i++,j--){
        swap(s[i],s[j]);
    }
    return;
}

void change(int num,string& s){
    reverse(s.begin(),s.end());
    reverse(s,0,num);
    reverse(s,num,s.size());
    return;
    
}

int main(){
    int num;
    string s;
    cin>>num>>s;
    
    change(num,s);
    cout<<s;
    
    return 0;
}

第二种

(1)用string类中的substr把后面k个元素截取下来,再用insert插入到0号元素之前。最后resize(size)原有长度即可。
(2)不过insert时间复杂度O(n),substr时间复杂度线性。


三、参考答案

第一种思路一致——先整体反转,再反转两段;
第二种思路——先反转两段,再整体反转。

第二种思路代码实现

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void reverse(string& s,int start,int end){//左闭右开
    if(start > s.size()|| end < 0){
        return;
    }
    for(int i = start,j = end-1;i < j;i++,j--){
        swap(s[i],s[j]);
    }
    return;
}

void change(int num,string& s){
	//这三行位置改变顺序,同时区间大小改变。
    reverse(s,0,s.size()-num);
    reverse(s,s.size()-num,s.size()); 
    reverse(s.begin(),s.end());
    
    return;
    
}

int main(){
    int num;
    string s;
    cin>>num>>s;
    
    change(num,s);
    cout<<s;
    
    return 0;
}


总结

整体操作再分段操作。

(欢迎指正,转载标明出处)

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值