E卷-5键键盘-(100分)
E卷-刷题笔记合集🔗
问题描述
小兰有一个特殊的5键键盘,上面有 、
、
、
、
五个键。这些键的功能如下:
键:在屏幕上输出一个字母a
:将当前选择的字母复制到剪贴板
:将当前选择的字母复制到剪贴板,并清空选择的字母
:将当前剪贴板里的字母输出到屏幕
:选择当前屏幕上的所有字母
注意以下规则:
- 剪贴板初始为空,新的内容被复制到剪贴板时会覆盖原来的内容
- 当屏幕上没有字母时,
无效
- 当没有选择字母时,
和
无效
- 当有字母被选择时,
和
这两个有输出功能的键会先清空选择的字母,再进行输出
请帮助小兰计算,给定一系列键盘输入后,最终屏幕上会显示多少个字母。
输入格式
输入为一行,用数字 分别代表
、
、
、
、
五个键的输入,数字用空格分隔。
输出格式
输出一个整数,表示最终屏幕上字母的数量。
样例输入1
1 1 1
样例输出1
3
样例输入2
1 1 5 1 5 2 4 4
样例输出2
2
样例解释
样例1 | 连续键入3个a,故屏幕上字母的长度为3。 |
样例2 | 输入两个a后ctrl-a选择这两个a,再输入a时选择的两个a先被清空,所以此时屏幕只有一个a。后续的ctrl-a,ctrl-c选择并复制了这一个a,最后两个ctrl-v在屏幕上输出两个a,故屏幕上字母的长度为2(第一个ctrl-v清空了屏幕上的那个a)。 |
数据范围
- 输入的数字序列长度
满足
- 输入的每个数字
满足
题解
这是一个模拟题,需要按照题目要求模拟键盘的操作过程。主要需要维护三个状态:
- 屏幕显示的内容:用一个数组或列表存储当前屏幕上的字母
- 剪贴板的内容:用一个数组或列表存储当前剪贴板中的内容
- 选择状态:用一个布尔值表示当前是否有内容被选中
关键点:
- 在有内容被选中的状态下,输入新内容(a或ctrl-v)会先清空选中内容
- ctrl-c和ctrl-x只在有内容被选中时才有效
- ctrl-a只在屏幕有内容时才有效
- 剪贴板的内容在复制时会覆盖原有内容
时间复杂度:,其中
是输入序列的长度。
参考代码
def solve():
# 读取输入
cmds = list(map(int, input().split()))
# 初始化状态
screen = [] # 屏幕显示的内容
clip = [] # 剪贴板的内容
selected = False # 是否有内容被选中
# 处理每个命令
for cmd in cmds:
if cmd == 1: # 输入a
if selected:
screen.clear()
screen.append('a')
selected = False
elif cmd == 2: # ctrl-c
if selected:
clip = screen.copy()
elif cmd == 3: # ctrl-x
if selected:
clip = screen.copy()
screen.clear()
selected = False
elif cmd == 4: # ctrl-v
if selected:
screen.clear()
screen.extend(clip)
selected = False
elif cmd == 5: # ctrl-a
if screen:
selected = True
# 输出结果
print(len(screen))
if __name__ == "__main__":
solve()
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 读取输入
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记