九宫格按键输入

这篇文章讲述了如何使用Java实现一个九宫格按键输入系统,支持数字模式下直接输出数字,英文模式下按键字母循环显示,以及模式切换和延迟功能。通过示例代码展示了处理输入字符串并根据模式转换输出的过程。
摘要由CSDN通过智能技术生成

华为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
输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值