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

华为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. 输出结果:处理完所有指令后,输出最终的文本。

Python

"""
@author: code5bug
"""
k = int(input())
data = input()
pos = 0

for _ in range(k):
    cmd, x = input().split()
    if cmd == "FORWARD":  # 指针向前移动
        pos = min(len(data), pos + int(x))
    elif cmd == "BACKWARD":  # 指针向后移动
        pos = max(0, pos - int(x))
    elif cmd == "SEARCH-FORWARD":  # 向前搜索
        idx = data.rfind(x, pos)
        if idx != -1:
            pos = idx
    elif cmd == "SEARCH-BACKWARD":  # 向后搜索
        sz = len(x)
        for s in range(pos - sz, -1, -1):
            t = data[s:s+sz]
            if t == x:
                pos = s
                break
    elif cmd == "INSERT":  # 插入
        data = data[:pos] + x + data[pos:]
        pos += len(x)
    elif cmd == "REPLACE":  # 替换字符
        data = data[:pos] + x
    elif cmd == "DELETE":  # 删除字符
        sz = min(len(data) - pos, int(x))
        data = data[:pos] + data[pos + sz:]

print(data)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

什码情况

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

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

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

打赏作者

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

抵扣说明:

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

余额充值