华为OD机试算法- 5键键盘
题目描述
有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。
a键在屏幕上输出一个字母a;
ctrl-c将当前选择的字母复制到剪贴板;
ctrl-x将当前选择的字母复制到剪贴板,并清空选择的字母;
ctrl-v将当前剪贴板里的字母输出到屏幕;
ctrl-a选择当前屏幕上的所有字母。
注意:
给定一系列键盘输入,输出最终屏幕上字母的数量。
输入描述
输出描述
用例
输出 | 3 |
说明 | 连续键入3个a,故屏幕上字母的长度为3。 |
输出 | 2 |
说明 | 输入两个a后ctrl-a选择这两个a,再输入a时选择的两个a先被清空,所以此时屏幕只有一个a, |
题目解析
逻辑题,主要考察多情况的处理。
题目中没有准确说明 选择状态 何时被解除,比如我ctrl-a全选所有字母时,然后ctrl-c将选择的字母复制到剪贴板,那么此时屏幕中字母的选中状态是保留还是清除呢?
我理解ctrl-x剪切走屏幕内容,没有字母了,自然就没有选中状态了。另外,a、ctrl-v输入时,如果有字母选中状态,则输入时会覆盖选中内容,那么选中状态就没了。
Java算法源码 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] commands = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray(); System.out.println(getResult(commands)); } public static int getResult(int[] commands) { ArrayList<String> screen = new ArrayList<>(); ArrayList<String> clipboard = new ArrayList<>(); boolean isSelect = false; for (int command : commands) { switch (command) { case 1: if (isSelect) screen.clear(); screen.add("a"); isSelect = false; break; case 2: if (isSelect) { clipboard.clear(); clipboard.addAll(screen); } break; case 3: if (isSelect) { clipboard.clear(); clipboard.addAll(screen); screen.clear(); isSelect = false; } break; case 4: if (isSelect) screen.clear(); screen.addAll(clipboard); isSelect = false; break; case 5: if (!screen.isEmpty()) isSelect = true; break; } } return screen.size(); } }
JS算法源码 const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (input) => { const directives = input.split(" "); console.log(getFinalLetterCount(directives)); }); function getFinalLetterCount(directives) { const screen = []; const clipboard = []; let isSelecting = false; directives.forEach((directive) => { switch (directive) { case "1": if (isSelecting) screen.length = 0; screen.push("a"); isSelecting = false; break; case "2": if (isSelecting) { clipboard.length = 0; clipboard.push(...screen); } break; case "3": if (isSelecting) { clipboard.length = 0; clipboard.push(...screen); screen.length = 0; isSelecting = false; } break; case "4": if (isSelecting) screen.length = 0; screen.push(...clipboard); isSelecting = false; break; case "5": if (screen.length !== 0) isSelecting = true; break; } }); return screen.length; }
Python算法源码 commands = list(map(int, input().split())) def getResult(): screen = [] clip = [] isSelect = False for command in commands: if command == 1: if isSelect: screen.clear() screen.append("a") isSelect = False elif command == 2: if isSelect: clip.clear() clip.extend(screen) elif command == 3: if isSelect: clip.clear() clip.extend(screen) screen.clear() isSelect = False elif command == 4: if isSelect: screen.clear() screen.extend(clip) isSelect = False elif command == 5: if len(screen) != 0: isSelect = True return len(screen) print(getResult())#华为OD机试算法题库#