机试题——编辑器

题目描述

该编辑器有以下功能:

  1. 插入insert str。表示将字符串str插入到当前游标所处位置,同时游标移动到str的右边。
  2. 删除delete len。表示将游标左边长度为len的字符串删除。要求该功能命令合法,即len≥0,如果len<0或者len大于字符串长度,则认为输入非法,不进行操作。
  3. 移动move cnt。将游标移动cnt次,如果为负数,向左移动,为正数,向右移动。如果cnt超过字符串左右边界,那么认为非法,不进行移动。
  4. 复制copy。将游标左边字符串复制并插入到游标的右边。游标位置不变。

输入描述

每行仅输入一个功能对应的操作。如果为end,代表操作结束。

初始时,字符串为空。游标位置为0

  • 1 ≤ str.length ≤ 40
  • 1 ≤ len ≤ 40
  • -40 ≤ cnt ≤ 40
  • 调用insertdeletemovecopy的总次数不超过200次。

输出描述

最终的文本结果,注意,结果应当包含游标,用|表示。

用例输入

bash 复制代码
insert test
insert pass
move 10
delete 4
insert fail
move -4
copy
end
bash 复制代码
test|testfail

解题思路

  1. 数据结构设计
    • 使用一个字符串res来存储当前文本内容。
    • 使用一个整数p表示游标位置。
  2. 功能实现
    • 插入 :使用string::insert方法将字符串插入到游标位置,并更新游标位置。
    • 删除:检查删除长度是否合法,如果合法,则从游标左边删除指定长度的字符,并更新游标位置。
    • 移动:检查移动后的位置是否超出边界,如果合法,则更新游标位置。
    • 复制:将游标左边的字符串复制并插入到游标右边,游标位置不变。
  3. 最终输出
    • 在游标位置插入|,然后输出整个字符串。

代码

cpp 复制代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
#include<set>
#include<list>
#include<sstream>
#include<bitset>
#include<stack>
#include<climits>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    string res = "";
    int p = 0; // 游标位置
    string c;
    while (cin >> c && c != "end") {
        if (c == "end") return 0;
        else if (c == "insert") {
            string temp;
            cin >> temp;
            res.insert(p, temp); // 在游标位置插入字符串
            p += temp.size(); // 游标移动到插入字符串的右边
        }
        else if (c == "delete") {
            string temp;
            cin >> temp;
            int len = atoi(temp.c_str());
            if (len > p || len <= 0) continue; // 检查删除操作是否合法
            for (int i = 0; i < len; i++) {
                res.erase(res.begin() + p - 1); // 从游标左边删除字符
                p--; // 游标位置更新
            }
        }
        else if (c == "move") {
            string temp;
            cin >> temp;
            int cnt = atoi(temp.c_str());
            if (p + cnt < 0 || p + cnt > res.size()) continue; // 检查移动操作是否合法
            p += cnt; // 更新游标位置
        }
        else {
            // copy
            string cur = res.substr(0, p); // 获取游标左边的字符串
            res.insert(p, cur); // 将其复制到游标右边
        }
    }
    for (int i = 0; i < res.size(); i++) {
        if (i == p) {
            cout << "|"; // 在游标位置插入 |
        }
        cout << res[i];
    }
    return 0;
}
相关推荐
Robot_Nav几秒前
贪心算法、动态规划与 MPPI 算法结构相关力扣题目汇总
算法·贪心算法·动态规划
战族狼魂35 分钟前
每日一课:算法系统学习路线
人工智能·算法·大模型·大语言模型
变量未定义~44 分钟前
连通块中点的数量、堆箱子(4星)
算法
盐焗鹌鹑蛋1 小时前
【C++】set和map
c++
j7~1 小时前
【算法】专题二:滑动窗口之水果成蓝,找到字符串中所有字⺟异位词等算法题
c++·算法·滑动窗口·水果成蓝·最小字串覆盖·优选算法精选
木木子221 小时前
# 星座配对深度解析:Select 长列表选择器、矩阵评分算法与数据驱动建议
java·算法·华为·矩阵·harmonyos
一拳一个呆瓜1 小时前
【STL】iostream 编程:文件输出流的成员函数
c++·stl
大鱼>1 小时前
AI+货物追踪:跨境电商包裹追踪系统
人工智能·深度学习·算法·机器学习
Huangjin007_1 小时前
【C++11篇(四)】新的类功能、lambda 与包装器详解
开发语言·c++
大鱼>1 小时前
AI+货物追踪:全链路货物可视化追踪系统
人工智能·深度学习·算法·机器学习