华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。
看不懂有疑问需要答疑辅导欢迎私VX: code5bug
题目描述
某公司为了更高效的编写代码,邀请你开发一款代码编辑器程序。
程序的输入为 已有的代码文本和指令序列,程序需输出编辑后的最终文本。指针初始位置位于文本的开头。 支持的指令(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
题解
这道题目属于模拟题,主要考察对字符串操作的模拟能力。需要根据不同的指令对文本进行编辑,并维护指针的位置。
解题思路
- 初始化:读取初始文本和指令序列,初始化指针位置为0(文本开头)。
- 处理指令:
- 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个字符。
- 输出结果:处理完所有指令后,输出最终的文本。
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();
})();
希望这个专栏能让您熟练掌握算法, 🎁🎁🎁。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏