天梯——L1-110 这不是字符串题

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    string s;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        s+=char(x+'0');
    }
    while(m--){
        int x;
        cin>>x;
        if(x==1){
            int l1;
            string s1;
            cin>>l1;
            for(int i=0;i<l1;i++){
                int a;
                cin>>a;
                s1+=char(a+'0');
            }
             int l2;
            string s2;
            cin>>l2;
            for(int i=0;i<l2;i++){
                int a;
                cin>>a;
                s2+=char(a+'0');
            }
            int k=s.find(s1);
            if(k!=-1){
                s.erase(k,l1);
                s.insert(k,s2);
            }
        }
        else if(x==2){
            for(int i=0;i<s.size()-1;i++){
//注意这里i的范围,防止数组越界,i也可i=1;i<s.size(),此时就是s[i-1]+s[i]
                int t=s[i]+s[i+1];
                if(t%2==0){
                    string s3;
                    s3+=char(t/2);
                    s.insert(i+1,s3);
                    i++;
                }
            }
        }
       else{
            int l,r;
            cin>>l>>r;
            reverse(s.begin()+l-1,s.begin()+r);
        }
    }

    for(int i=0;i<s.size();i++){
        if(i!=s.length()-1) cout<<s[i]-'0'<<" ";
        else cout<<s[i]-'0';
    }
    return 0;
}

分析

本题虽然都在围绕这整数来讲,但是下面的操作涉及替换,查找,插入,翻转,这与字符串的功能很类似,于是我们可以用字符串来做。但输入时是一个整数一个整数输入的,因此我们要把这些数变成一个字符串。变成字符串后s,开始进行查找s.find(s1),如果找不到,返回-1。删除 s.erase(k,l1); 插入s.insert(k,s2);翻转reverse(s.begin()+l-1,s.begin()+r);这里要特别注意翻转的使用

变成字符串操作

cpp 复制代码
for(int i=0;i<n;i++){
        int x;
        cin>>x;
        s+=char(x+'0');
    }

string s; :声明一个空字符串 s ,用于存储初始序列。

for(int i = 0; i < n; i++) :循环 n 次,读取初始序列的每个数字。

int x; cin >> x; :读取一个整数 x ,表示序列中的数字。

s += char(x + '0' ); :将数字 x 转换为字符并添加到字符串 s 中。

字符串翻转

字符串整体翻转:reverse(s.begin(),s.end())

将字符串的[l,r]翻转: reverse(s.begin()+l-1,s.begin()+r);因为翻转是左闭右开的,而且字符串的下标是从0开始的,因此左边要'-1'

字符与 ASCII 码值

字符是以 ASCII 码值(美国信息交换标准代码)的形式存储的。每个字符都对应着一个唯一的整数,例如字符 '0' 对应的 ASCII 码值是 48,字符 '1' 对应的是 49,以此类推。当对这两个字符进行加法运算时(int t=s[i]+s[i+1];),实际上是对它们对应的 ASCII 码值进行加法运算。

cpp 复制代码
int t=s[i]+s[i+1];
  if(t%2==0){
     string s3;
    s3+=char(t/2);
     s.insert(i+1,s3);
        i++;
       }

这个代码用的是字符的ASCII码进行加减,因此可以直接s3+=char(t/2);因为t/2本身就是一个字符

也可以

cpp 复制代码
int t=(s[i]-'0')+(s[i+1]-'0');
                if(t%2==0){
                    string s3;
                    s3+=char(t/2+'0');
                    s.insert(i+1,s3);
                    i++;

此时将字符转化为整数,用整数之间相加减,得到t是一个整数,因此需要用t/2+'0'将其变为一个字符,再添加到字符串 s3中。

注意

一定不要忘记x==2操作时的i++;因为添加一个数后,所添加的数索引为i+1,原来i+1位置上的数变成了i+2;要先i++,将添加的数跳过,那么在for循环中又可以回到原来的i+1上了。

相关推荐
老鼠只爱大米几秒前
LeetCode经典算法面试题 #114:二叉树展开为链表(递归、迭代、Morris等多种实现方案详细解析)
算法·leetcode·二叉树·原地算法·morris遍历·二叉树展开
今儿敲了吗4 分钟前
07| 高精度除法
c++
Ivanqhz7 分钟前
现代异构高性能计算(HPC)集群节点架构
开发语言·人工智能·后端·算法·架构·云计算·边缘计算
Sayuanni%320 分钟前
数据结构_Map和Set
java·数据结构
HyperAI超神经33 分钟前
覆盖天体物理/地球科学/流变学/声学等19种场景,Polymathic AI构建1.3B模型实现精确连续介质仿真
人工智能·深度学习·学习·算法·机器学习·ai编程·vllm
执着25943 分钟前
力扣hot100 - 144、二叉树的前序遍历
数据结构·算法·leetcode
范纹杉想快点毕业1 小时前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
陳10301 小时前
C++:map和set的使用
开发语言·c++
苏宸啊1 小时前
list底层实现
c++·list
近津薪荼1 小时前
递归专题(4)——两两交换链表中的节点
数据结构·c++·学习·算法·链表