【2025刷题笔记】- 5键键盘

刷题笔记合集🔗

5键键盘

问题描述

卓小姐有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。

a键在屏幕上输出一个字母a;

ctrl-c将当前选择的字母复制到剪贴板;

ctrl-x将当前选择的字母复制到剪贴板,并清空选择的字母;

ctrl-v将当前剪贴板里的字母输出到屏幕;

ctrl-a选择当前屏幕上的所有字母。

注意:

  1. 剪贴板初始为空,新的内容被复制到剪贴板时会覆盖原来的内容
  2. 当屏幕上没有字母时,ctrl-a无效
  3. 当没有选择字母时,ctrl-c和ctrl-x无效
  4. 当有字母被选择时,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. 首先,我们需要维护屏幕内容。可以使用一个列表或字符串来存储。
  2. 同时,要有一个变量跟踪剪贴板内容。
  3. 另外,用一个布尔变量标记当前是否有选中内容。

然后针对不同的按键操作:

  • 按键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%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务