L1-120 智慧文本编辑器 - java

L1-120 智慧文本编辑器


语言 时间限制 内存限制 代码长度限制 栈限制
Java (javac) 500 ms 512 MB 16KB 8192 KB
Python (python3) 400 ms 256 MB 16KB 8192 KB
其他编译器 400 ms 64 MB 16KB 8192 KB

题目描述:

众所周知,随着基于大语言模型(LLM)的人工智能的大规模普及,现在越来越多的系统拥有了人工智能模块(当然,拼题 A 也有)。为了响应潮流,龙龙打算也做一个智慧文本编辑器,但因为大语言模型的 API 太贵了,龙龙打算让这个编辑器的"智慧"停留在名字上就好了。但功能还是得写的,具体来说,对于当前正在编辑的文档,这个编辑器应当支持以下三个功能:

  1. 查找指定字符串 s 1 s_1 s1 前 3 3 3 次出现的位置;
  2. 在指定位置 p p p 插入一个指定字符串 s 2 s_2 s2
  3. 将某一段连续的字符串翻转。
    真的文本编辑器可太复杂了,这里我们只简单化考虑由大小写英文字母和数字组成的字符串。

声明:本题仅限人类解答。

输入格式:

输入第一行是一个整数 N ( 1 ≤ N ≤ 50 ) N (1 \le N \le 50) N(1≤N≤50),表示操作的数量。

第二行是一个字符串 S ( 1 ≤ ∣ S ∣ ≤ 10 3 ) S (1 \le ∣S∣ \le10^3) S(1≤∣S∣≤103),表示待操作的初始字符串。

接下来的 N N N 行,每行给出一条操作指令。根据操作种类,分别为以下格式:

  • 1 s1:对应查找操作,查找字符串 s 1 s_1 s1 在当前字符串 T T T 中前 3 3 3 次出现的位置。
  • 2 p s2:对应插入操作,将字符串 s 2 s_2 s2 插入到当前字符串 T T T 中"下标为 p p p 的字符"之前。当 p = ∣ T ∣ p=∣T∣ p=∣T∣ 时,表示插入到字符串末尾。
  • 3 l r:对应翻转操作,将当前字符串 T T T 中下标从 l l l 到 r r r 的连续子串翻转。

字符串下标从 0 0 0 开始。保证所有输入中的字符串都只包含大小写英文字母和数字,且满足: 1 ≤ ∣ s 1 ∣ ≤ 5 , 1 ≤ ∣ s 2 ∣ ≤ 10 1 \le ∣s_1∣ \le 5,1 \le ∣s_2∣ \le 10 1≤∣s1∣≤5,1≤∣s2∣≤10。

对于第二类和第三类操作,保证输入下标合法,即第二类操作满足 0 ≤ p ≤ ∣ T ∣ 0 \le p \le ∣T∣ 0≤p≤∣T∣,第三类操作满足 0 ≤ l ≤ r < ∣ T ∣ 0 \le l \le r <∣T∣ 0≤l≤r<∣T∣。

说明:对于任意字符串 X X X, ∣ X ∣ ∣X∣ ∣X∣ 表示字符串 X X X 的长度。

输出格式:

对于第一类操作,按从小到大的顺序输出查找到的所有位置(即目标字符串的第一个字符在当前字符串中的下标),相邻两个位置之间用 1 1 1 个空格分隔。如果不足 3 3 3 次,就按实际查找到的次数输出;如果一次也没有找到,输出 − 1 -1 −1。

注意:只要位置不同,就算是不同次出现,出现的字符串允许相互重叠。例如 ababa 中出现了 2 2 2 次 aba,位置依次为 0 0 0 和 2 2 2。

对于第二类和第三类操作,输出操作后的结果字符串。

输入样例:

10

ababa

1 a

1 aba

1 aca

2 0 X

2 6 Y

2 3 M

3 2 6

3 4 4

1 aa

3 0 7

输出样例:

0 2 4

0 2

-1

Xababa

XababaY

XabMabaY

XaabaMbY

XaabaMbY

1

YbMabaaX

数据约定:

题目中设置三个单一操作的数据,对应三种不同的操作,三个数据加起来分配不超过 75 75% 75 的分数。


按照指定指令执行不同的操作

  • 1: 查找字符串 s 1 s_1 s1 在当前字符串 T T T 中前 3 3 3 次出现的位置。
  • 2: 将字符串 s 2 s_2 s2 插入到当前字符串 T T T 中"下标为 p p p 的字符"之前。当 p = ∣ T ∣ p=∣T∣ p=∣T∣ 时,表示插入到字符串末尾。最后输出操作后的结果字符串。
  • 3: 将当前字符串 T T T 中下标从 l l l 到 r r r 的连续子串翻转。最后输出操作后的结果字符串。

emmmmmmm

1:模拟

按照每个要求依次模拟即可

    1. 使用嵌套循环依次判断即可。
    • 在每次内层循环中依次判断 s[i + j]t[j] 的内容是否相等。
      • 如果出现了不相等的情况,那么就表示当前以 i 开始的子串与 字符串 t 不相等。
      • 如果到最后也没找到不相同的情况,那么就表示当前字符串t字符串si 开始的子串。
    1. 依次添加内容到list中即可。
    • 首先先将字符串s中下标为0~k-1的字符全部添加到list
    • 然后再将字符串t的所有字符全部添加到list
    • 最后再将字符串s中下标为k-1以后的字符全部添加到list
    1. 使用for循环依次枚举每个将要反转的内容
java 复制代码
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main
{
    static void op1(char[] s)
    {
        char[] t = sc.next().toCharArray();
        int n = s.length, m = t.length;
        int pos = 0;
        for (int i = 0; i < n && i + m <= n; i++) // 枚举字符串s的每一个子串
        {
            boolean f = true; // 假设当前字符串t是字符串s中以i开始的子串
            for (int j = 0; j < m; j++)
            {
                if (s[i + j] != t[j]) // 出现了两个对应字符出现了不同
                {
                    f = false; // 那么就表示当前字符串t不是字符串s中以i开始的子串
                    break;
                }
            }
            if (f == true) // 如果当前字符串t是字符串s中以i开始的子串
            {
                if (pos++ != 0) out.print(" "); // 如果不是第一个内容,就输出一个空格
                out.print(i);
            }
            if (pos == 3) break; // 如果已经找到了三个子串了,就结束循环
        }
        if (pos == 0) out.print(-1); // 如果没有找到任何子串,就输出-1
        out.println();
    }

    static String op2(char[] s)
    {
        int k = sc.nextInt();
        char[] t = sc.next().toCharArray();
        List<Character> list = new ArrayList<>();
        for (int i = 0; i < k; i++) list.add(s[i]); // 将字符串s的前k个字符保存到list中
        for (char c : t) list.add(c); // 将字符串t的每个字符添加到list中
        for (int i = k; i < s.length; i++) list.add(s[i]); // 将字符串s的剩余部分添加到list中
        String S = "";
        for (char c : list) S += c; // 拼接字符串
        out.println(S);
        return S;
    }

    static String op3(char[] s)
    {
        int l = sc.nextInt(), r = sc.nextInt();
        for (; l <= r; l++, r--) // 枚举区间[l, r]
        {
            // 交换 s[l] 和 s[r] 的内容
            char a = s[l];
            s[l] = s[r];
            s[r] = a;
        }
        out.println(new String(s));
        return new String(s);
    }

    public static void main(String[] args)
    {
        int n = sc.nextInt();
        String s = sc.next();
        while (n-- > 0)
        {
            int op = sc.nextInt();
            if (op == 1) op1(s.toCharArray());
            else if (op == 2) s = op2(s.toCharArray());
            else s = op3(s.toCharArray());
        }

        out.flush();
        out.close();
    }

    static Scanner sc = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
}

2: 利用StringBuilder类库实现

    1. 利用 s.indexOf(t, k) 函数查询当前字符串t字符串s第k个位置开始第一次出现的位置
    1. 利用 s.insert(k, t) 函数将字符串t插入字符串s第k个位置之前
    1. 利用 s.substring(l, r) 函数获取字符串sl~r-1之间所有字符串;利用 s.reverse() 函数将字符串s 中所有内容进行翻转
java 复制代码
import java.io.PrintWriter;
import java.util.Scanner;

public class Main
{
    static void op1(StringBuilder s)
    {
        String t = sc.next();
        int k = s.indexOf(t, 0);
        int pos = 0;
        while (k != -1 && pos != 3)
        {
            if (pos++ != 0) out.print(" ");
            out.print(k);
            k = s.indexOf(t, k + 1);
        }
        if (pos == 0) out.print(-1);
        out.println();
    }

    static StringBuilder op2(StringBuilder s)
    {
        int k = sc.nextInt();
        String t = sc.next();
        s.insert(k, t);
        out.println(s);
        return s;
    }

    static StringBuilder op3(StringBuilder s)
    {
        int l = sc.nextInt(), r = sc.nextInt();
        StringBuilder sb = new StringBuilder(s.substring(l, r + 1));
        sb.reverse();
        s.replace(l, r + 1, sb.toString());
        out.println(s);
        return s;
    }

    public static void main(String[] args)
    {
        int n = sc.nextInt();
        String S = sc.next();
        StringBuilder s = new StringBuilder(S);
        while (n-- > 0)
        {
            int op = sc.nextInt();
            if (op == 1) op1(s);
            else if (op == 2) s = op2(s);
            else s = op3(s);
        }

        out.flush();
        out.close();
    }

    static Scanner sc = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
}

StringBuilder


如果有说错的 或者 不懂的 尽管提 嘻嘻

一起进步!!!


闪现
天梯赛

相关推荐
sycmancia2 小时前
Qt——缓冲区操作与目录操作
开发语言·qt
weisian1512 小时前
进阶篇-LangChain篇-15--高级Agent架构—复杂任务拆解(Plan-and-Execute架构)和多智能体协作(LangGraph)
java·架构·langchain·langgraph·planexecute架构
AIGC设计所2 小时前
网络安全SRC漏洞挖掘学习路线 - 第四期:常见漏洞挖掘实操,实现首次挖洞突破
开发语言·网络·学习·安全·web安全
就叫飞六吧2 小时前
在线考试翻页抓取题目导出js
开发语言·前端·javascript
凤年徐2 小时前
自动化构建工具:make 与 Makefile
android·java·linux·自动化
neo33012 小时前
debian13 编译源码qt5.15.18
开发语言·qt
Xiu Yan2 小时前
Java 转 C++ 系列:STL常用函数
java·开发语言·c++·stl·visual studio
.ZGR.2 小时前
【全栈实战】搭建属于你的AI图像生成平台:从Java Swing 到 Web 应用
java·人工智能·node.js
**蓝桉**2 小时前
负载均衡概述
开发语言·阿里云·云计算·负载均衡