【2025刷题笔记】- 5键键盘
刷题笔记合集🔗
5键键盘
问题描述
卓小姐有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。
a键在屏幕上输出一个字母a;
ctrl-c将当前选择的字母复制到剪贴板;
ctrl-x将当前选择的字母复制到剪贴板,并清空选择的字母;
ctrl-v将当前剪贴板里的字母输出到屏幕;
ctrl-a选择当前屏幕上的所有字母。
注意:
- 剪贴板初始为空,新的内容被复制到剪贴板时会覆盖原来的内容
- 当屏幕上没有字母时,ctrl-a无效
- 当没有选择字母时,ctrl-c和ctrl-x无效
- 当有字母被选择时,a和ctrl-v这两个有输出功能的键会先清空选择的字母,再进行输出
给定一系列键盘输入,输出最终屏幕上字母的数量。
输入格式
输入为一行,为简化解析,用数字
代表a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键的输入,数字用空格分隔。
输出格式
输出一个数字,为最终屏幕上字母的数量。
样例输入
1 1 1
1 1 5 1 5 2 4 4
样例输出
3
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)。 |
数据范围
- 输入的按键序列长度不超过
- 输入中的数字只会是
到
之间的整数
题解
这道题目模拟了我们日常使用的文本编辑器的基本操作。要解决它,我们需要跟踪三个关键状态:屏幕上的内容、剪贴板内容和当前是否有选中的文本。
关键点在于理解各个操作之间的交互规则:
- 首先,我们需要维护屏幕内容。可以使用一个列表或字符串来存储。
- 同时,要有一个变量跟踪剪贴板内容。
- 另外,用一个布尔变量标记当前是否有选中内容。
然后针对不同的按键操作:
- 按键1(a键):如果有选中内容,先清空选中内容,然后添加一个'a'到屏幕;否则直接添加'a'。
- 按键2(ctrl-c):如果有选中内容,将屏幕内容复制到剪贴板。
- 按键3(ctrl-x):如果有选中内容,将屏幕内容复制到剪贴板并清空屏幕。
- 按键4(ctrl-v):如果有选中内容,先清空选中内容;然后将剪贴板内容添加到屏幕。
- 按键5(ctrl-a):如果屏幕有内容,将全部内容标记为选中状态。
这里最容易出错的点是:当有选中内容时,a键和ctrl-v键会清空选中内容后再进行输出。
时间复杂度是O(n),其中n是输入的按键序列长度,因为我们需要遍历每个按键并执行相应操作。空间复杂度也是O(n),主要用于存储屏幕和剪贴板的内容。
参考代码
- Python
import sys
input = lambda: sys.stdin.readline().strip()
# 读取输入的按键序列
cmd_list = list(map(int, input().split()))
def solve():
# 屏幕内容
screen = []
# 剪贴板内容
clip = []
# 是否有选中状态
selected = False
for cmd in cmd_list:
if cmd == 1: # a键
if selected:
# 清空选中内容
screen.clear()
selected = False
# 输出'a'到屏幕
screen.append('a')
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()
selected = False
# 粘贴剪贴板内容到屏幕
screen.extend(clip)
elif cmd == 5: # ctrl-a
if screen:
# 选中全部内容
selected = True
# 返回屏幕字母数量
return len(screen)
# 输出结果
print(solve())
- Cpp
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
string line;
getline(cin, line);
stringstream ss(line);
vector<int> cmds;
int tmp;
// 解析输入的按键序列
while (ss >> tmp) {
cmds.push_back(tmp);
}
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记


