首页 > 试题广场 >

文本编辑器

[编程题]文本编辑器
  • 热度指数:132 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
【注意:本题按通过的Case比例给分】

本题需要让你实现一个类似vi的基于命令模式的文本编辑器,但仅需要少数几个命令。

先介绍一下光标(上图中最左边的是编辑器显示的行号,用来展示用,并不是文本真正的内容,请忽略)

1.该编辑器里的光标是类似vi编辑器里命令模式那样,停留在一个字符上方,而不是字符与字符之间。

2.编辑器文本为空的时候(初始时,或者把内容全部删除以后),会显示一个空行,光标停留在那行行首(如图1)。此时执行o命令的话,在下方插入一行(如图2)。

3.当光标停留在一个空行的时候,光标会显示在行首,但此时执行i命令和a命令的效果是一样的(如图3)。


再介绍一下撤销(undo)和重做(redo)命令:

1.编辑器的undoredo操作跟vi编辑器的一样,是一个基于栈式的撤销功能。每当玩家输入一个命令的时候,如果可撤销的话(见第二条),就该操作压进Undo栈里,栈的大小为无限大,允许撤销全部的操作。

2.只有真正改变编辑器内文本的命令才会进入Undo栈,比如g命令,以及未对文本发生修改的d命令,还有undoredo命令本身都是不可撤销的,即不会进入Undo栈。

3.当执行undo命令的时候,如果Undo栈里有元素,则从栈顶弹出最后一个命令,撤销掉该命令,光标回到执行该命令前的位置,并且将命令压入Redo栈里。

4.当执行redo命令的时候,如果Redo栈里有元素,则从栈顶弹出最后一个被撤销的命令,重新执行该命令,光标回到执行该命令后的位置,并且将命令重新压入Undo栈里。

5.当执行undoredo命令的时候,如果相应的栈里没有元素,则不进行任何操作,忽略该命令。

6.当执行任何输入的命令的时候,都会清空Redo栈,即用undo撤销一个命令C的时候,再执行输入的其他命令以后,则不能再用redo功能重做上一次撤销的命令C


完整的命令列表为:

g x y: 移动光标命令,将光标移动到第x行,第y列上方。当x超过总行数时,则为最后一行。当y超过该行列数的时候,则为最后一列。

i str:在光标所在字符前插入str这句话,光标最终会停留在这句话的最后一个字符上。注意,str必定不为空,但是里面可能包含空格。

a str:在光标所在字符后插入str这句话,其他同上。

o str:在光标所在行的下面另起一新行插入str这句话,其他同上。

dd:删除光标所在行,光标最终会停留在下一行的首字符上。如果删除的是最后一行,则停留在最后一行的首字符上。

d n:从光标所在位置开始,往右删除n个字符(输入保证n>0),最多只会删除到行尾,不会跨过当前行。光标最终停留在删除以后的下一个字符位置上。

undo:撤销上一个对文本发生改动的命令,光标也回到上一个命令执行前所在的位置。如果没命令可以撤销,则什么都不做。

redo:重新执行上一个撤销的命令,光标也回到上一个命令执行后所在的位置。如果没有已经撤销的命令,则什么都不做。注意,如果undo了一个命令,再执行新的命令,则也不能redo

其中命令名字与参数、参数与参数中间都是用一个空格分割


下图为测试用例例子里的的编辑器里的展示




输入描述:
每个测试输入包含1个测试用例

输入的每一行为一个命令,请处理到输入结束,输入最多不超过1000行,且每行均为合法的命令

输入保证每一行输入的最大字符数不超过1000个字符,且只包含英文、数字和空格


输出描述:
请输出编辑器打开以后(初始状态),执行完输入命令以后,最后显示的文本
示例1

输入

i abcdef
o abcd
g 1 10
a abcdef
d 4
undo
redo
dd
dd
dd
a hello world

输出

hello world
太简单了,但是输入框太小了,过程写不下
发表于 2021-03-30 19:27:18 回复(1)
shabi网易,专门出垃圾笔试题目。
首先有几个坑点,没有删除任何字符的d命令不会被加入redo栈。
还有几个定义上的疏漏,敢问笔试哪个大神把这道题完美a出来了?
发表于 2022-03-03 21:49:14 回复(0)
同样的代码,同样的输入,自测输入的结果和提交运行的结果不一样!我麻了
发表于 2022-01-26 00:32:29 回复(0)