题目描述
九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入""或者其他字符,则循环中断,输出此时停留的字母。数字和字母的对应关系如下,注意0只对应空格:
输入一串按键,要求输出屏幕显示1.#用于切换模式,默认是数字模式,执行 #后切换为英文模式;2./表示延迟,例如在英文模式下,输入 22/222,显示为 bc,数字模式下/没有效果,3.英文模式下,多次按同一键,例如输入 22222,显示为b;输入描述
输入范围为数字 o~9 和字符"#’、",输出屏幕显示,例如:在数字模式下,输入 1234,显示1234在英文模式下,输入 1234,显示,adg输出描述
输出屏幕显示的字符
示例1
输入
2222/22
输出
222222
说明
默认数字模式,字符直接显示,数字模式下/无序
示例2
输入
#2222/22
输出
ab
说明
#进入英文模式,连续的数字输入会循环选择字母,!直至输入/,故第一段2222输入显示a,第二段22输入显示b
示例3
输入
#222233
输出
ae
说明
#进入英文模式,连续的数字输入会循环选择字母,直至输入其他数字,故第一段2222输入显示a,第二段33输入显示e
题解
对输入进行分段,然后逐个解析输入
源码
import java.util.*;public class NineKeyBoard2 {static Input input;static Map<Character, char[]> map = new HashMap<>();static {input = new Input("#2222/22");map.put('1', new char[]{',','.'});map.put('2', new char[]{'a','b', 'c'});map.put('3', new char[]{'d', 'e', 'f'});map.put('4', new char[]{'g', 'h', 'i'});map.put('5', new char[]{'j', 'k', 'l'});map.put('6', new char[]{'m', 'n', 'o'});map.put('7', new char[]{'p', 'q', 'r', 's'});map.put('8', new char[]{'t', 'u', 'v'});map.put('9', new char[]{'w', 'x', 'y', 'z'});map.put('0', new char[]{' '});}public static void main(String[] args) {String string = input.nextLine();List<String> list = new ArrayList<>();for (int i = 0; i < string.length(); i++) {if (Character.isDigit(string.charAt(i))) {int left = i;int right = i + 1;while (right < string.length() && string.charAt(left) == string.charAt(right)) {right++;}String temp = string.substring(left, right);i = right - 1;list.add(temp);} else {list.add(string.charAt(i) + "");}}String result = "";boolean numberModel = true;for (int i = 0; i < list.size(); i++) {if ("#".equals(list.get(i))) {numberModel = !numberModel;} else if ("/".equals(list.get(i))) {} else {result += getTypingChar(list.get(i), numberModel);}}System.out.println(result);}public static String getTypingChar(String string, boolean numberModel) {if (numberModel) {return string;}char[] chars = map.get(string.charAt(0));return chars[(string.length() - 1) % chars.length] + "";}}