华为OD机试(JS,C++,JAVA,PYTHON)-5键键盘

这是一道逻辑题,涉及一个5键键盘,包括a、ctrl-c、ctrl-x、ctrl-v和ctrl-a键。键盘操作会影响屏幕上的字母显示和剪贴板内容。给定一系列键盘输入,需要计算最终屏幕上字母的数量。题目解析和四种编程语言的算法源码也进行了说明。
摘要由CSDN通过智能技术生成

题目描述

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

题目解析

逻辑题 ,主要考察多情况的处理。

题目中没有准确说明  选择状态 何时被解除,比如我ctrl-a全选所有字母时,然后ctrl-c将选择的字母复制到剪贴板,那么此时屏幕中字母的选中状态是保留还是清除呢?

我理解ctrl-x剪切走屏幕内容,没有字母了,自然就没有选中状态了。另外,a、ctrl-v输入时,如果有字母选中状态,则输入时会覆盖选中内容,那么选中状态就没了。

算法源码

PYTHON

def FiveKeyBoard(s):
    screen = ''
    clip = ''
    selected = False
    for i in s:
        if i == '1' and not selected:  # a
            screen += 'a'
        elif i == '1' and selected:  # a
            screen = 'a'
            selected = False
        elif i == '2' and selected and screen:  
            clip = screen
        elif i == '3' and selected and screen:  
            clip = screen
            screen = ''
            selected = False
        elif i == '4' and selected:  
            screen = clip
            selected = False
        elif i == '4' and not selected:  
            screen += clip
        elif i == '5' and screen: 
            selected = True
    return len(screen)
 
 
if __name__ == "__main__":
    line = str(input().strip())
    print(FiveKeyBoard(line))

C++


// Online C++ compiler to run C++ program online
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<exception> 
#include<map>
#include<cmath>
#include<unordered_map>
#include<set>
#include<climits>
#include<ctype.h>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
 
int main(){
    // 处理输入
    string input_str;
    getline(cin, input_str);
 
	vector<char> v;//记录输入值
	vector<char> v2;//面板
	vector<char> v3;//剪切板
	for (int i=0;i<input_str.size();i++) {
	    if (input_str[i] != ' ') {
	        v.push_back(input_str[i]);
	    }
	}
	int flag = 0;
	for (int i=0;i<v.size();i++) {
		switch (v[i]) {
        	case '1': //A
        		if (flag != 1) {
        			v2.push_back('A');
        			flag = 0;
        		}
        		else {
        			v2.clear();
        			v2.push_back('A');
        			flag = 0;
        		}			
        		break;
        	case '2': //C
        		if (v2.size()!= 0&& flag!=0) {
        			v3 = v2;
        		}
        		break;
        	case '3': //x
        		if (v2.size() != 0 && flag != 0) {
        			v3 = v2;
        			v2.clear();
        		}
        		break;
        	case '4': //V
        		if ((v3.size()!=0)&&(flag != 0)) {
        			v2 = v3;
        			flag = 0;
        		}
        		else if (v3.size() != 0) {
        			v2.insert(v2.end(),v3.begin(), v3.end());
        			flag = 0;
        		}
        		break;
        	case '5': //A
        		flag = 1;
        		break;
        	default:
        		break;
		}
	}
	cout << v2.size();
 
    return 0;
}

JAVA

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
 
public class Main { 
    public static void main(String[] args) {
        //处理输入
        Scanner in=new Scanner(System.in); 
        String[] operation_list = in.nextLine().split(" ");
 
        StringBuilder res_str = new StringBuilder();
 
        String choose = "";
        String tab = "";
 
        for (String op : operation_list) {
            switch (op) {
                case "1":
                    choose = reset(res_str, choose);
                    res_str.append('A');
                    break;
                case "2":
                    if (!choose.isEmpty()) {
                        tab = choose;
                    }
                    break;
                case "3":
                    if (!choose.isEmpty()) {
                        tab = choose;
                        choose = "";
                        res_str = new StringBuilder();
                    }
                    break;
                case "4":
                    choose = reset(res_str, choose);
                    res_str.append(tab);
                    break;
                case "5":
                    if (res_str.length() != 0) {
                        choose = res_str.toString();
                    }
                    break;
                default:
                    break;
            }
        }
 
        System.out.println(res_str.length());
    }
 
    private static String reset(StringBuilder res_str, String choose) {
        if (!choose.isEmpty()) {
            res_str.replace(0, choose.length(), "");
            choose = "";
        }
        return choose;
    }
 
}

JAVASCRIPT


//let s = readline().split(" ");
//let s = "1 1 1".split(" ");
let s = "1 1 5 1 5 2 4 4".split(" ");
 
let temp = "";//剪贴板
let screen = "";//屏幕
let select = "";//选择的
 
for(let i=0; i<s.length; i++){
 
    switch (s[i]){
        case "1":
            if(select!=""){
                screen = "a";
                select = "";
            }else {
                screen+="a";
            }
            break;
        case "2":
            if(select!=""){
                temp = select;
            }
            break;
        case "3":
            if(select!=""){
                temp = select;
                screen = "";
                select = "";
            }
            break;
        case "4":
            if(select!=""){
                screen = temp;
                select = "";
            }else {
                screen+=temp;
            }
            break;
        case "5":
            if(screen!=""){
                select = screen;
            }
            break;
    }
}
 
console.log(screen.length);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华为OD面试指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值