5键键盘的输出 - 华为OD统一考试

OD统一考试

题解: Java / Python / C++

5键键盘的输出 - 华为OD统一考试_第1张图片

题目描述

有一个特殊的 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这两个有输出功能的键会先清空选择的字母,再进行输出
给定一系列键盘输入,输出最终屏幕上字母的数量。

输入描述

输入为一行,为简化解析,用数字 12345代表 a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键的输入,数字用空格分隔

输出描述

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

示例1

输入
1 1 1

输出
3

说明
连续键入3个a,故屏幕上字母的长度为3

示例2

输入
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 

using namespace std;

int main() {
    string s;
    getline(cin, s);

    // 当前屏幕总字符数,选择的字符数,剪切板中的字符数
    int tot = 0, selectCnt = 0, clipboardCnt = 0;
    // 是否选择了字符
    bool selected = false;

    for (char op : s) {
        if (op == '1') { // a
            if (selected) {
                tot -= selectCnt;
                selected = false;
            }
            tot += 1;
        } else if (op == '2') { // ctrl-c
            if (selected) {
                clipboardCnt = selectCnt;
            }
        } else if (op == '3') { // ctrl-x
            if (selected) {
                tot -= selectCnt;
                clipboardCnt = selectCnt;
                selected = false;
            }
        } else if (op == '4') { // ctrl-v
            if (selected) {
                tot -= selectCnt;
                selectCnt = 0;
                selected = false;
            }
            tot += clipboardCnt;
        } else if (op == '5') { // ctrl-a
            selectCnt = tot;
            selected = true;
        }
    }

    cout << tot << endl;
    return 0;
}

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();

        // 当前屏幕总字符数,选择的字符数,剪切板中的字符数
        int tot = 0, selectCnt = 0, clipboardCnt = 0;
        // 是否选择了字符
        boolean selected = false;

        for (char op : s.toCharArray()) {
            if (op == '1') { // a
                if (selected) {
                    tot -= selectCnt;
                    selected = false;
                }
                tot += 1;
            } else if (op == '2') { // ctrl-c
                if (selected) {
                    clipboardCnt = selectCnt;
                }
            } else if (op == '3') { // ctrl-x
                if (selected) {
                    tot -= selectCnt;
                    clipboardCnt = selectCnt;
                    selected = false;
                }
            } else if (op == '4') { // ctrl-v
                if (selected) {
                    tot -= selectCnt;
                    selectCnt = 0;
                    selected = false;
                }
                tot += clipboardCnt;
            } else if (op == '5') { // ctrl-a
                selectCnt = tot;
                selected = true;
            }
        }

        System.out.println(tot);
    }
}

Python

s = input()

# 当前屏幕总字符数,选择的字符数,剪切板中的字符数
tot,selectCnt,clipboardCnt = 0,0,0
# 是否选择了字符
selected = False

for op in s:
    if op == '1':  # a
        if selected:
            tot -= selectCnt
            selected = False
        tot += 1
    elif op == '2':  # ctrl-c
        if selected:
            clipboardCnt = selectCnt
    elif op == '3':  # ctrl-x
        if selected:
            tot -= selectCnt
            clipboardCnt = selectCnt
            selected = False
    elif op == '4':  # ctrl-v
        if selected:
            tot -= selectCnt
            selectCnt = 0
            selected = False
        tot += clipboardCnt
    elif op == '5':  # ctrl-a
        selectCnt = tot
        selected = True

print(tot)

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。

你可能感兴趣的:(华为OD机试真题&题解,华为od,java,算法,python,面试,开发语言,c++)