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

OD统一考试

题解: Java / Python / C++

alt

题目描述

有一个特殊的 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 <iostream>

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)

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

#校招##秋招##面经##华为##java#
全部评论
有更好的解法,欢迎评论区留下, 大家有笔试真题欢迎投稿,祝大家
点赞 回复 分享
发布于 2023-12-26 11:49 湖北

相关推荐

合适才能收到offe...:项目岗是什么岗?我看你有段好像跟策划运营相关,如果找运营的话第三段经历写详细点儿。 个人建议是把自我评价删了换成专业技能放在工作经验上或者下面。学生会那个也可以删,把第一个包装成店铺运营,写4-6给点。第三个也是写4-6个点。注意工作内容➕部分数据。 投递的时候BOS招呼用语改一下,换成我有xx工作经验,熟练掌握xx技能样式,也可以简历截图然后直接发送。
点赞 评论 收藏
分享
萧索X:写篮球联赛干嘛,陪老板打篮球吗。还有实习经历要写自己所在岗位具体完成什么工作,自己的任务具体完成了什么需求,给公司带来了哪些量化增长
点赞 评论 收藏
分享
评论
3
4
分享

创作者周榜

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