华为OD算法题记录
–
前言
一、题目描述
九宫格按键输入,输出显示内容,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入" "或者其他字符,则循环中断。
二、输入描述:
输入范围为数字0~9和字符#、/,输出屏幕显示,例如在数字模式下,输入1234,显示1234;在英文模式下,输入1234,显示,adg。
三、输出描述:
#用于切换模式,默认是数字模式,执行#后切换为英文模式, /表示延迟,例如在英文模式下,输入22/222,显示为bc;
四、java代码
private static Map<String, List<String>> map = new HashMap<>();
static {
List list1 = new ArrayList();
list1.add(",");
list1.add(".");
list1.add("?");
list1.add("!");
map.put("1", list1);
List list2 = new ArrayList();
list2.add("a");
list2.add("b");
list2.add("c");
map.put("2", list2);
List list3 = new ArrayList();
list3.add("d");
list3.add("e");
list3.add("f");
map.put("3", list3);
List list4 = new ArrayList();
list4.add("g");
list4.add("h");
list4.add("i");
map.put("4", list4);
List list5 = new ArrayList();
list5.add("j");
list5.add("k");
list5.add("l");
map.put("5", list5);
List list6 = new ArrayList();
list6.add("m");
list6.add("n");
list6.add("o");
map.put("6", list6);
List list7 = new ArrayList();
list7.add("p");
list7.add("q");
list7.add("r");
list7.add("s");
map.put("7", list7);
List list8 = new ArrayList();
list8.add("t");
list8.add("u");
list8.add("v");
map.put("8", list8);
List list9 = new ArrayList();
list9.add("w");
list9.add("x");
list9.add("y");
list9.add("z");
map.put("9", list9);
}
/**
* 1.默认是数字模式 遇到#则会切换为另一种模式
* 2.同一个按键连续按会一次出现按键上的字母 如果遇到空格或其他字符则循环中断
* 3. /表示延迟
*
* @autor xiaomage编程
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//获取九宫格按键字符串
String line = sc.nextLine();
String[] split = line.split("");
//定义输入模式,false代表数字模式
boolean flag = false;
StringBuilder builder = new StringBuilder();
//定义正常的字符串
String sz = "123456789";
for (int i=0; i< split.length; i++) {
String s = split[i];
if (flag) {
//英文模式
if (!split[i].equals("#") && !split[i].equals("/")) {
//如果遇到空格或者其他字符,则中断循坏,直接输出当前结果
if (!sz.contains(s)) {
break;
}
//获取下一个元素的下标
int j = i+1;
//初始化元素重复的个数,从0开始,因为九宫格数字对应的字母集合下标是从0开始
int m =0;
while (j<split.length && s.equals(split[j])) {
j++;
m++;
}
//定义当前按键对应字母的下标
int index;
//1,7,9键位对应的字母个数为4个,其余为三个
if("179".contains(s)){
index = m%4;
} else {
index = m%3;
}
builder.append(map.get(s).get(index));
//跳过已经遍历过的字母
i = j - 1;
}
//"如果在英文模式下当前字符为'#' 则切换为数字模式"
if (split[i].equals("#")) {
flag = false;
}
} else {
//数字模式
if (!split[i].equals("#") && !split[i].equals("/")) {
//如果遇到空格或者其他字符,则中断循坏,直接输出当前结果
if(!sz.contains(s)) {
break;
}
builder.append(split[i]);
}
//如果在数字模式下当前字符为'#' 则切换为英文模式
if(split[i].equals("#")) {
flag = true;
}
}
}
System.out.println(builder);
}
五、测试用例:
输入:
123#2222#3#5//5556
输出:
输入:123#2222#3#50//5556
输出: