鱼C论坛

 找回密码
 立即注册
查看: 1244|回复: 2

[已解决]感觉用递归写但找不到出口,或者有什么其他好的方法吗

[复制链接]
发表于 2023-11-23 19:40:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include  <bits/stdc++.h>
using namespace std;
int l,r,k;
void  solve(string &s)
{
    cin>>l>>r>>k;
    l--,r--;
    string ans1,ans2,ans3,ans;
    int len=s.size();
    
    ans2=s.substr(l,r-l+1);
    // cout<<ans1<<" "<<ans2<<" "<<ans3<<endl;
    int size=ans2.size();
    for(int i=0;i<k;i++)
    {
        ans1=s.substr(0,l);
        ans3=s.substr(r+1,len-r-1);
        ans2=ans2[size-1]+ans2.substr(0,r-l);
        
    }
    ans=ans1+ans2+ans3;
    solve(ans);
    cout<<ans<<endl;
 

}
int main()
{
    string s;
    cin>>s;
    int n;
    cin>>n;
    while(n--)
    {
        solve(s);
    }
}
最佳答案
2023-11-23 19:55:07
本帖最后由 柿子饼同学 于 2023-11-23 21:46 编辑

不用递归啊 , 顺次修改就好
下面是我的代码
如果你想用递归的话 , 可以在最后加一个判断 , 如果 n == 0 就打印答案 , 然后返回
#include <bits/stdc++.h>
using namespace std;

string s;
int n;

void Modify(int l, int r, int k){
    l--, r--;
    k %= (r - l + 1);                                   // 这里是为了 k 不会超出 s 的范围, 取模不会影响答案, 多转整个一圈不会改变答案
    string temp = s.substr(r - k + 1, k);               // 要从前面出来的那个部分, 是 s[r - k + 1, r]

    for(int i = r - k; i >= l; i--) s[i + k] = s[i];    // 前面的倒着偏移 k
    for(int i = 0; i < k; i++) s[l + i] = temp[i];      // 后面的补回来
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> s >> n;

    while(n--){
        int l, r, k;
        cin >> l >> r >> k;
        Modify(l, r, k);                                // 顺次修改就好
    }
    
    cout << s;
    
    return 0;
}
Snipaste_2023-11-23_19-38-52.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-23 19:40:42 | 显示全部楼层
递归是一种解决问题的常用方法,但并不是适用于所有情况,有时候也可以使用其他的方法来解决问题。

在你提供的代码中,递归并不是必需的。根据代码的需求,你可以直接使用字符串的substr函数来获取子字符串。这个函数的参数是起始索引和需要获取的子字符串的长度。在你的代码中,你已经计算了起始索引l和子字符串的长度r-l+1,所以可以直接使用substr函数来获取子字符串ans2。

下面是修改后的代码:

#include <iostream>
using namespace std;
int main() {
    string s;
    cin >> s;
    int l, r, k;
    cin >> l >> r >> k;
    l--, r--;
    string ans2 = s.substr(l, r - l + 1);
    cout << ans2 << endl;
    return 0;
}

这样,你就可以直接打印出子字符串ans2了。

希望能帮到你!如果还有其他问题,请继续提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-23 19:55:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2023-11-23 21:46 编辑

不用递归啊 , 顺次修改就好
下面是我的代码
如果你想用递归的话 , 可以在最后加一个判断 , 如果 n == 0 就打印答案 , 然后返回
#include <bits/stdc++.h>
using namespace std;

string s;
int n;

void Modify(int l, int r, int k){
    l--, r--;
    k %= (r - l + 1);                                   // 这里是为了 k 不会超出 s 的范围, 取模不会影响答案, 多转整个一圈不会改变答案
    string temp = s.substr(r - k + 1, k);               // 要从前面出来的那个部分, 是 s[r - k + 1, r]

    for(int i = r - k; i >= l; i--) s[i + k] = s[i];    // 前面的倒着偏移 k
    for(int i = 0; i < k; i++) s[l + i] = temp[i];      // 后面的补回来
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> s >> n;

    while(n--){
        int l, r, k;
        cin >> l >> r >> k;
        Modify(l, r, k);                                // 顺次修改就好
    }
    
    cout << s;
    
    return 0;
}

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表