华为OD机试真题 Java 实现【字母组合】【2023Q1 200分】-LMLPHP

一、题目描述

每个数字对应多个字母,对应关系如下:

0:a,b,c 1:d,e,f 2:g,h,i 3:j,k,l 4:m,n,o 5:p,q,r 6:s,t 7:u,v 8:w,x 9:y, z

输入一串数字后,通过数字和字母的对应关系可以得到多个字母字符串(要求按照数字的顺序组合字母字符串);

屏蔽字符: 屏蔽字符中的所有字母不能同时在输出的字符串出现,如屏蔽字符时abc,则要求字符串中不能同时出现a,b,c,但是允许同时出现a,b;a,c;b,c等;

给定一个数字字符串和一个屏蔽字符串,输出所有可能的字符组合;

例如:

输入数字字符串78和屏蔽字符串ux,输出结果为uw,vw,vx;

数字字符串78,可以得到如下字符串: uw,ux,vw,vx;由于ux是屏蔽字符串,因此排除ux,最终的输出时uw,vw,vx;

二、输入描述

第一行输入为一串数字字符串,数字字符串中的数字不允许重复,数字字符串的长度大于0,小于等于5;
第二行输入是屏蔽字符,屏蔽字符的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复。

三、输出描述

输出可能的字符串组合。

注:字符串之间使用逗号隔开,最后一个字符串后携带逗号

四、Java算法源码

/**
 * 78
 * ux
 */
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    // 数字字符串
    String numbers = in.nextLine();
    // 屏蔽字符串
    String noStr = in.nextLine();

    List<String> list = new ArrayList<String>();
    // 数字对应的字母组合
    String[] arr = new String[numbers.length()];
    for (int i = 0; i < numbers.length(); i++) {
        // 单个数字
        int number = Integer.valueOf(numbers.charAt(i)+"");
        // 数字对应的字母组合
        arr[i] = hashMap.get(number);
    }

    int index = 0;
    LinkedList<Character> charLine = new LinkedList<>();
    solution(arr, index, list, charLine, noStr);
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i) + ",");
    }
}

/**
 *
 * @param arr 数字对应的字母组合
 * @param index 第几个字母
 * @param list 不包含屏蔽字符串的字符串集合
 * @param charLine 合格的字母集合
 * @param noStr 屏蔽字符串
 */
public static void solution(String[] arr, int index, List<String> list, LinkedList<Character> charLine, String noStr) {
    if (index == arr.length) {
        StringBuilder builder = new StringBuilder();
        for (Character c : charLine) {
            builder.append(c);
        }

        // 屏蔽字符中的所有字母不能同时在输出的字符串出现
        if (isContainsNoStr(builder.toString(), noStr)) {
            list.add(builder.toString());
        }
        return;
    }

    for (int i = 0; i < arr[index].length(); i++) {
        charLine.addLast(arr[index].charAt(i));
        solution(arr, index + 1, list, charLine, noStr);
        charLine.removeLast();
    }
}

/**
 * 是否包含屏蔽字符串
 *
 * 屏蔽字符中的所有字母不能同时在输出的字符串出现
 */
public static boolean isContainsNoStr(String s, String noStr) {
    boolean flag = false;
    // 要求按照数字的顺序组合字母字符串
    for (int i = 0; i < noStr.length(); i++) {
        if (!s.contains(noStr.charAt(i) + "")) {
            flag = true;
            break;
        }
    }
    return flag;
}

/**
 * 每个数字对应多个字母
 */
private static Map<Integer, String> hashMap = new HashMap<Integer, String>();

static {
    hashMap.put(0, "abc");
    hashMap.put(1, "def");
    hashMap.put(2, "ghi");
    hashMap.put(3, "jkl");
    hashMap.put(4, "mno");
    hashMap.put(5, "pqr");
    hashMap.put(6, "st");
    hashMap.put(7, "uv");
    hashMap.put(8, "wx");
    hashMap.put(9, "yz");
}

五、效果展示

1、输入

78
ux

2、输出

uw,vw,vx,

华为OD机试真题 Java 实现【字母组合】【2023Q1 200分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【服务中心选址】【2023Q1 100分 】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【字母组合】【2023Q1 200分】-LMLPHP

05-24 17:31