【华为OD题库-027】代码编辑器-java

news/2024/7/20 19:03:00 标签: 华为od, java

题目

某公司为了更高效的编写代码,邀请你开发一款代码编辑器程序。程序的输入为已有的代码文本和指令序列,程序需输出编辑后的最终文本。指针初始位置位于文本的开头。
支持的指令(X为大于等于0的整数,word为无空格的字符串):
FORWARD X:指针向前(右)移动X,如果指针移动位置超过了文本末尾,则将指针移动到文本未尾BACKWARD X:指针向后(左)移动X,如果指针移动位置超过了文本开头,则将指针移动到文本开头
SEARCH-FORWARD word:从指针当前位置向前查找word并将指针移动到word的起始位置,如果未找到则保持不变
SEARCH-BACKWARD word:在文本中向后查找word并将指针移动到word的起始位置,如果未找到则保持不变
INSERT word:在指针当前位置前插入word,并将指针移动到word的结尾
REPLACE word:在指针当前位置替换并插入字符(删除原有字符,并增加新的字符)
DELETE X:在指针位置删除X个字符
输入描述:
输入的第一行为命令列表的长度K
输入的第二行为文件中的原始文本接下来的K行,每行为一个指令
输出描述:
编辑后的最终结果
补充说明:
文本最长长度不超过256K
示例1
输入:
1
ello
INSERT h
输出: hello
说明: 在文本开头插入
示例2
输入:
2
hllo
FORWARD 1
INSERT e
输出: hello
说明: 在文本的第一个位置插入

示例3
输入:
2
hell
FORWARD 1000
INSERT o
输出:hello
说明: 在文本的结尾插入
示例4
输入:
1
hello
REPLACE HELLO
输出: HELLO
说明:替换
示例5
输入:
1
hello
REPLACE HELLO WORLD
输出: HELLO WORLD
说明: 超过文本长度替换
示例6
输入:
2
hell
FORWARD 100000
REPLACE o
输出: hello
说明: 超出文本长度替换

思路

简单逻辑处理题,注意边界即可
本文逻辑,index范围为0到str.length。为str.legnth时代表指针在文件末尾
注:字符串应该更好处理,转为chars数组反而麻烦很多,本文就是以chars数组实现的

题解

java">package hwod;

import java.util.Scanner;

public class CodeEditor {
    private static char[] chars;
    private static int index = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k = Integer.parseInt(sc.nextLine());
        chars = sc.nextLine().toCharArray();
        String[] commands = new String[k];
        for (int i = 0; i < k; i++) {
            commands[i] = sc.nextLine();
        }
        codeEditor(commands);
        System.out.println(String.valueOf(chars));
    }

    private static void codeEditor(String[] commands) {
        int n = commands.length;
        for (int i = 0; i < n; i++) {
            String[] split = commands[i].split("\\s+", 2);
            String cmd = split[0];
            String val = split[1];
            switch (cmd) {
                case "FORWARD":
                    forward(Integer.parseInt(val));
                    break;
                case "BACKWARD":
                    backward(Integer.parseInt(val));
                    break;
                case "SEARCH-FORWARD":
                    searchForward(val);
                    break;
                case "SEARCH-BACKWARD":
                    searchBackward(val);
                    break;
                case "INSERT":
                    insert(val);
                    break;

                case "REPLACE":
                    replace(val);
                    break;
                case "DELETE":
                    delete(Integer.parseInt(val));
                    break;
                default:
                    System.out.println("指令不合法");
            }
        }
    }

    private static void searchForward(String val) {
        char[] target_chars = val.toCharArray();
        int i = Math.min(index, chars.length - 1);
        while (i >= 0) {
            int j = target_chars.length - 1;
            while (i >= 0 && chars[i] != target_chars[j]) i--;//先找到和val最后一个字符相等的位置。
            int t = i;
            while (i >= 0 && j >= 0 && chars[i] == target_chars[j]) {
                j--;
                i--;
            }
            if (j == -1) {
                index = i + 1;
                break;
            }
            i = t;
        }

    }

    private static void searchBackward(String val) {
        char[] target_chars = val.toCharArray();
        int i = index;
        while (i < chars.length) {
            int j = 0;
            while (i < chars.length && chars[i] != target_chars[j]) i++;//先找到和val第一个字符相等的位置。
            int t = i;
            while (i < chars.length && j < val.length() && chars[i] == target_chars[j]) {
                j++;
                i++;
            }
            if (j == val.length()) {
                index = t;
                break;
            }
            i = t;
        }
    }

    private static void insert(String val) {
        char[] newChars = new char[val.length() + chars.length];
        for (int i = 0; i < newChars.length; i++) {
            if (i < index) {
                newChars[i] = chars[i];
                continue;
            }
            if (i - index < val.length()) {
                newChars[i] = val.charAt(i - index);
            } else {
                newChars[i] = chars[i - val.length()];
            }
        }
        chars = newChars;
        index += val.length();
    }

    private static void delete(int n) {
        int curn = chars.length - index;
        if (n > curn) n = curn;
        char[] newChar = new char[chars.length - n];
        for (int i = 0; i < newChar.length; i++) {
            if (i < index) {
                newChar[i] = chars[i];
            } else {
                newChar[i] = chars[i + n];
            }
        }
        chars = newChar;
    }

    private static void replace(String val) {
        delete(val.length());
        insert(val);

    }

    private static void backward(int n) {
        index = Math.max(0, index - n);
    }

    private static void forward(int n) {
        index = Math.min(chars.length, index + n);


    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。


http://www.niftyadmin.cn/n/5194150.html

相关文章

英语 有空就更新

would 主语 like noun/to do? 询问他人意愿 Would you like dinner&#xff1f; Would you like meat? Would they like to hava roasted vegetables,then? What would 主语 like ( to do) ? 询问他人的意愿 What would you like to eat? 讲解 这句话使用了 what wo…

代码实现—多头自注意力多头交叉注意力

多头注意力和交叉注意力 多头注意力 多头注意力(Multi-Head Attention)是一种基于自注意力机制(self-attention)的改进方法。自注意力是一种能够计算出输入序列中每个位置的权重&#xff0c;因此可以很好地处理序列中长距离依赖关系的问题。但在应用中&#xff0c;可能存在多个…

【RocketMq系列-01】RocketMq安装和基本概念

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709 RocketMq安装和基本概念 一&#xff0c;RocketMq安装和基本概念1&#xff0c;RocketMq基本安装(本地安装)2&#xff0c;rocketmq-dashboard3&am…

图书馆整理I(从尾到头打印列表),剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路(辅助栈)&#xff1a; 代码&#xff08;递归&#xff09;&#xff1a; 代码&#xff08;列表插入&#xff09;&#xff1a; 相似题目对…

C++之内建函数对象

C之内建函数对象 算术仿函数 #include<iostream> using namespace std; #include<functional>//内建函数对象头文件 //内建函数对象 算术仿函数void test() {// negate 一元仿函数 取反仿函数negate<int>n;cout << n(100) << endl;//plus 二元仿…

通信原理板块——纠错编码最小码距与纠错能力的计算

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 对纠错编码的最小码距d0与编码的检…

【IPC】消息队列

1、IPC对象 除了最原始的进程间通信方式信号、无名管道和有名管道外&#xff0c;还有三种进程间通信方式&#xff0c;这 三种方式称之为IPC对象 IPC对象分类&#xff1a;消息队列、共享内存、信号量(信号灯集) IPC对象也是在内核空间开辟区域&#xff0c;每一种IPC对象创建好…

Meta降本增效大招之:自动删除数据

这是一个系列博客。介绍的是Meta如何通过弃用产品、清理代码、删除数据以实现降本增效。这对于效能平台的建设非常具有指导意义。 上一篇介绍的是如何自动清理死代码&#xff0c;本篇介绍如何自动化删除数据。也是本系列的最后一篇。 文章最后有原文链接和我个人的总结。懒的同…