代码编辑器 - 华为OD机试真题(JavaScript题解)

华为OD机试题库《C++》限时优惠 9.9

华为OD机试题库《Python》限时优惠 9.9

华为OD机试题库《JavaScript》限时优惠 9.9

针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。

看不懂有疑问需要答疑辅导欢迎私VX: code5bug

华为OD机试真题

题目描述

某公司为了更高效的编写代码,邀请你开发一款代码编辑器程序。

程序的输入为 已有的代码文本和指令序列,程序需输出编辑后的最终文本。指针初始位置位于文本的开头。 支持的指令(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个字符

备注: 文本最长长度不超过 256K

输入描述

输入的第一行为命令列表的长度K

输入的第二行为文件中的原始文本

接下来的K行,每行为一个指令

输出描述

编辑后的最终结果

示例1

输入:

2
hllo
FORWARD 1
INSERT e

输出:

hello

说明:

在文本的第一个位置插入

示例2

输入:

1
ello
INSERT h

输出:

hello

说明:

在文本开头插入

示例3

输入:

2
hell
FORWARD 1000
INSERT o

输出:

hello

说明:

在文本的结尾插入

示例4

输入:

1
hello
REPLACE HELLO

输出:

HELLO

题解

这道题目属于模拟题,主要考察对字符串操作的模拟能力。需要根据不同的指令对文本进行编辑,并维护指针的位置。

解题思路

  1. 初始化:读取初始文本和指令序列,初始化指针位置为0(文本开头)。
  2. 处理指令
    • FORWARD X:指针向右移动X,不超过文本末尾。
    • BACKWARD X:指针向左移动X,不超过文本开头。
    • SEARCH-FORWARD word:从指针当前位置向前查找word,并将指针移动到word的起始位置。
    • SEARCH-BACKWARD word:从指针当前位置向后查找word,并将指针移动到word的起始位置。
    • INSERT word:在指针当前位置前插入word,并将指针移动到word的结尾。
    • REPLACE word:替换指针当前位置的字符为word。
    • DELETE X:删除指针当前位置的X个字符。
  3. 输出结果:处理完所有指令后,输出最终的文本。

JavaScript

const rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// Author: code5bug
(async () => {
    const k = parseInt(await readline());
    let data = await readline(); // 原始文本
    let pos = 0;	// 初始指针所在位置

    for (let i = 0; i < k; i++) {
        let [cmd, x] = (await readline()).split(' ');
        if(cmd === "FORWARD"){ // 指针向前移动
            pos = Math.min(data.length, pos + parseInt(x));
        }else if(cmd === "BACKWARD"){	// 指针 向后移动
            pos = Math.max(0, pos - parseInt(x));
        }else if(cmd === "SEARCH-FORWARD"){ // 向前搜索
            let idx = data.indexOf(x, pos);
            if(idx !== -1){
                pos = idx;
            }
        }else if(cmd === "SEARCH-BACKWARD"){ // 向后搜索
            let sz = x.length;
            for(let s = pos - sz; s >= 0; s--){
                let t = data.substring(s, s + sz);
                if(t == x){
                    pos = s;
                    break;
                }
            }
        }else if(cmd === "INSERT"){ // 插入
            data = data.substring(0, pos) + x + data.substring(pos);
            pos += x.length;
        }else if(cmd === "REPLACE"){ // 替换字符
            data = data.substring(0, pos) + x;
        }else if(cmd === "DELETE"){ // 删除字符
            let sz = Math.min(data.length - pos, parseInt(x));
            data = data.substring(0, pos) + data.substring(pos + sz);
        }
    }
    console.log(data);
    rl.close();
})();

希望这个专栏能让您熟练掌握算法, 🎁🎁🎁。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什码情况

你的鼓励就是我最大的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值