6. 5键键盘的输出

127 阅读2分钟

题目描述

有一个特殊的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这两个有输出功能的键会先清空选择的字母,再进行输出

给定一系列[键盘输入],输出最终屏幕上字母的数量。

输入描述

  • 输入为一行,为简化解析,用数字1 2 3 4 5代表a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键的输入,数字用空格分隔。

输出描述

  • 输出一个数字,为最终屏幕上字母的数量。

用例

输入1 1 1
输出3
说明连续键入3个a,故屏幕上字母的长度为3。
输入1 1 5 1 5 2 4 4
输出2
说明输入两个a后ctrl-a选择这两个a,再输入a时选择的两个a先被清空,所以此时屏幕只有一个a,后续的ctrl-a,ctrl-c选择并复制了这一个a,最后两个ctrl-v在屏幕上输出两个a,故屏幕上字母的长度为2(第一个ctrl-v清空了屏幕上的那个a)。

C++源码

#include <iostream>
#include <vector>
#include <string>

int func(const std::vector<int>& vec)
{
    int total = 0; // 屏幕上的字符数
    int clipCnt = 0; // 剪切版的字母数
    int selected = 0; // 选中的字母数
    for (int i = 0; i < vec.size(); i++)
    {
        if (vec[i] == 1) {     // 输入a
            if (selected != 0) {
                total -= selected;
                selected = 0;
            }
            total++;
        }
        else if (vec[i] == 2)   // ctrl+c
        {
            if (selected != 0)
            {
                clipCnt = selected;
            }
        }
        else if (vec[i] == 3)  // ctrl+x
        {
            if (selected != 0)
            {
                clipCnt = selected;
                total -= selected;
                selected = 0;
            }
        }
        else if (vec[i] == 4) // ctrl+V会清空选择
        {
            if (selected != 0)
            {
                total -= selected;
                selected = 0;
            }
            total += clipCnt;
        }
        else if (vec[i] == 5) // ctrl+a
        {
            selected = total;
        }
    }
    return total;
}

int main()
{
    std::vector<int>vec;
    int num;
    while (std::cin >> num)
    {
        vec.push_back(num);
        if (getchar() == '\n') {
            break;
        }
    }
    std::cout << func(vec) << std::endl;
}