题目描述
有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。
a键在屏幕上输出一个字母a;
ctrl-c将当前选择的字母复制到剪贴板;
ctrl-x将当前选择的字母复制到剪贴板,并清空选择的字母;
ctrl-v将当前剪贴板里的字母输出到屏幕;
ctrl-a选择当前屏幕上的所有字母。
注意:
- 剪贴板初始为空,新的内容被复制到剪贴板时会覆盖原来的内容
- 当屏幕上没有字母时,ctrl-a无效
- 当没有选择字母时,ctrl-c和ctrl-x无效
- 当有字母被选择时,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);