蓝桥杯省赛最后一场算法小白赛,字符迁移

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;
    vector<int> diff(n + 1, 0); // 差分数组
    while (q--) {
        ll l, r, k;
        cin >> l >> r >> k;
        k %= 26;
        diff[l - 1] += k;//下标从0开始的
        diff[r] -= k;
    }
    // 计算前缀和
    for (int i = 1; i < n; ++i) {
        diff[i] += diff[i - 1];
    }
    for (int i = 0; i < n; ++i) {
        int offset = s[i] - 'a';//这点的差值最大为25也就是z减去‘a’的差值
        offset = (offset + diff[i]) % 26;
        s[i] = 'a' + offset;
        
    }
    cout << s << endl;
    return 0;
}

这个题很多人都易出错,我们找到一个简单的方法,帮助我们来理解,而且不易错,我们难点就是末尾移动到前面的时候,这点很难写

针对移动字符串的移动我决定说一下         字符串在二进制中0到25,这样就有26个

a为97然后z为122这两者的差距就是25

然后我们要找到一个简单的写法,而且要保证错误率低,还易懂的写法

首先我们在写的时候不知道改怎么确定末尾的移动方式,这也是一个易错点,并且很容易出错,然后把直接脑袋绕昏,并且自己感觉还没有错。不知道错在哪

现在按照我下面来写就不会出错,还比较简单

我们就把当前字符的ascll值加上你要移动的位置然后对26取余这样你就得到你要移动的差值

然后你在加上字符a的ascll值就到了你要移动到的位置,这样你就肯定不会出错了,下面看代码

比如说我们要移动k位,然后是z来移动的
#include <bits/stdc++.h>
using namespace std;
int main(){
int k=1;//随便你变化
int num='z'-'a'+k;
num%=26;
char c='a'+num;
cout<<c;
}

答案就出来了不会错,记住这个简单的方法就行了。

版权声明:本文为博主作者:helloKittywz原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/helloKittywz/article/details/137439542

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐