【华为OD题库-027】代码编辑器-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数组实现的

题解

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 searchBackward(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 searchForward(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.mzph.cn/news/148374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app使用

font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…

GEE生物量和碳储量——指定研究区利用遥感影像红色波段阈值(大津法)提取森林范围

简介 森林提取是指利用遥感技术从高分辨率遥感影像中自动或半自动地提取森林分布信息的过程。传统的森林提取方法主要基于数学模型和规则,但随着深度学习技术的发展,利用卷积神经网络(CNN)进行森林提取的方法越来越受到关注。 具体的步骤如下: 1. 数据获取:获取高分辨率…

HAL库STM32串口开启DMA接收数据

STM32CubeMx的配置 此博客仅仅作为记录&#xff0c;这个像是有bug一样&#xff0c;有时候好使&#xff0c;有时候不好&#xff0c;所以趁现在好使赶紧记录一下&#xff0c;很多地方用到串口接收数据&#xff0c;DMA又是一种非常好的接收方式&#xff0c;可以节约CPU的时间&…

Redis(哈希Hash和发布订阅模式)

哈希是一个字符类型字段和值的映射表。 在Redis中&#xff0c;哈希是一种数据结构&#xff0c;用于存储键值对的集合。哈希可以理解为一个键值对的集合&#xff0c;其中每个键都对应一个值。哈希在Redis中的作用主要有以下几点&#xff1a; 1. 存储对象&#xff1a;哈希可以用…

米家竞品分析

一、项目描述 1. 竞品分析描述 分析市场直接竞品和潜在竞品&#xff0c;优化产品核心结构和页面布局&#xff0c;确立产品核心功能定位。了解目标用户核心需求&#xff0c;挖掘用户魅力型需求&#xff0c;以及市场现状为产品迭代做准备。 2. 产品测试环境 二、市场 1. 行业…

css 设置网页最小字体为12px

谷歌浏览器默认最小字体为12px&#xff0c;但保不准万一有一天谷歌取消这个默认设置&#xff0c;或者一些人在设置中改了最小字体&#xff0c;为了防止万一&#xff0c;故系统设置了最小字体&#xff0c;主要利用了min和var的特性 :root {--responsive-font-size-primary: max…

AI自动直播软件,ai无人直播工具2.0支持多平台矩阵直播一键同步直播脚本内容【直播脚本+使用技术教程】

AI实景直播软件简介&#xff1a; 支持一台手机自动直播&#xff0c;支持语音和文字同时回复&#xff0c;商品自动弹窗&#xff0c;支持抖音、快手、视频号、美团平台直播&#xff0c;支持矩阵直播&#xff0c;一键同步直播脚本内容。 设备需求&#xff1a; 安卓手机&#xf…

TensorRT量化实战课YOLOv7量化:YOLOv7-QAT量化

目录 前言1. YOLOv7-QAT流程2. QAT训练流程 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基础上&#xff…

在做题中学习(30):字符串相加

思路&#xff1a; 相加时要转换成对应的数字&#xff0c;所以让字符数字-0 如‘9’-‘0’&#xff08;ASCII&#xff09;57-489 9110&#xff0c;会进1&#xff0c;把进位保存起来&#xff0c;只取0头插到新串里。 头插时要转换对应字符数字&#xff0c;所以让对应的数字‘…

基础算法:大整数减法

基础算法&#xff1a;大整数减法 1169&#xff1a;大整数减法 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 求两个大的正整数相减的差。 【输入】 共2行&#xff0c;第1行是被减数a&#xff0c;第2行是减数b(a > b)。每个大整数不超过200位&#xff0c;不会有多余…

数据结构:红黑树的插入实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 一、红黑树二、红黑树的插入三、代码实现总结 一、红黑树 红黑树的概念&#xff1a; 红黑树是一颗二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&…

深入理解栈与队列:从基本概念到高级实现

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

golang中的并发模型

并发模型 传统的编程语言&#xff08;如C、Java、Python等&#xff09;并非为并发而生的&#xff0c;因此它们面对并发的逻辑多是基于操作系统的线程。其并发的执行单元&#xff08;线程&#xff09;之间的通信利用的也是操作系统提供的线程或进程间通信的原语&#xff0c;比如…

【Unity】单例模式及游戏声音管理类应用

【Unity】单例模式及游戏声音管理类应用 描述 在日常游戏项目开发中&#xff0c;单例模式是一种常用的设计模式&#xff0c;它允许在应用程序的生命周期中只创建一个对象实例&#xff0c;并提供对该实例的全局访问点。通过使用单例模式&#xff0c;可以提高代码的可维护性和可…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦&#xff0c;满屏的红色波形常让人头疼不已&#xff0c;但x信号的产生原因却常常只有几种&#xff0c;只要遵循一定的代码规范&#…

超聚变服务器关闭超线程CPU的步骤(完整版)

前言: 笨鸟先飞&#xff0c;好记性不如烂笔头。 我们项目都用不到超线程CPU&#xff0c;所以调测设备的时候都需要关掉&#xff0c;最近新设备换成了超聚变的服务器&#xff0c;这篇记录我关闭&#xff08;超聚变&#xff09;服务器超线程CPU的方法步骤。 关闭超线程CPU的步骤…

Django command执行脚本

python web项目中经常会使用到脚本&#xff0c;一般来说有两种很简单的方法&#xff0c;一种是直接python function&#xff0c;另一种就是 django 自定义command。 对比常规脚本 这里举个简单的例子&#xff0c;比如初始化数据、文件名称为initialize_data.py &#xff08;1…

集合的运算

集合的运算 #include <stdio.h> #include <stdlib.h> void print(int size, char arr[]) {if (size 0) {printf("null");}for (int i 0; i < size; i) {printf("%c", arr[i]);}printf("\n"); } int main() {char U[] { a,b,c,…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…