全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:字母组合
知识点回溯
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
每个数字对应多个字母,对应关系如下:
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;
第二行输入是屏蔽字符,屏蔽字符的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复,
输出描述:
输出可能的字符串组合
注:字符串之间使用逗号隔开,最后一个字符串后携带逗号
示例1
输入:
78
ux
输出:
uw,vw,vx,
示例2
输入:
78
x
输出:
uw,vw,
解题思路:
回溯法求出所有可能的字母组合,并筛选出符合要求的(去除不能出现的字符)
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.Scanner; /** * @title 字母组合 * @Description 每个数字对应多个字母,对应关系如下: * 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; * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/28 */ public class Main { public static String noContain; public static StringBuffer res = new StringBuffer(); public static char[][] digits = { {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r'}, {'s', 't'}, {'u', 'v'}, {'w', 'x'}, {'y', 'z'} }; public static void main(String[] args) { Scanner sc = new Scanner(System.in); String numStr = sc.nextLine(); noContain = sc.nextLine(); //不包含的字符串 handle(0, numStr, ""); System.out.println(res); } /** * 回溯法求出所有可能的字母组合,并筛选出符合要求的(去除不能出现的字符) * * @param index 字母索引 * @param numStr 输入的数字字符串 * @param temp 字母组合 */ public static void handle(int index, String numStr, String temp) { if (temp.length() == numStr.length()) { //字符串的长度等于数字字符串的长度说明已经遍历完成 if (isTrue(temp)) { //字符串不包含noContain的进行拼接 res.append(temp + ","); } } else { int digitsIndex = numStr.charAt(index) - '0'; //字母的索引 char[] chars = digits[digitsIndex]; for (int i = 0; i < chars.length; i++) { handle(index + 1, numStr, temp + chars[i]); } } } /** * 屏蔽字符中的所有字母是否同时出现 * * @param str * @return */ public static boolean isTrue(String str) { for (int i = 0; i < noContain.length(); i++) { String c = String.valueOf(noContain.charAt(i)); if (!str.contains(c)) { //只要有一个没有出现,就满足要求 return true; } } return false; } }
代码实现二:Java满分代码实现
package com.codernav.demo.hwod.exam; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; /** * @title 字母组合 * @Description 每个数字对应多个字母,对应关系如下: * 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; * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/28 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str1 = sc.nextLine(); String str2 = sc.nextLine(); List<String[]> list = initList(); List<String[]> indexList = new ArrayList<>(); int n = str1.length(); for (int i = 0; i < n; i++) { int index = Integer.parseInt(str1.substring(i, i + 1)); indexList.add(list.get(index)); } List<String> arr = Arrays.asList(indexList.get(0)); for (int i = 1; i < indexList.size(); i++) { arr = build(arr, indexList.get(i)); } for (String str : arr) { if (check(str, str2)) { System.out.print(str + ","); } } } public static boolean check(String str, String checkStr) { for (int i = 0; i < checkStr.length(); i++) { if (!str.contains(checkStr.substring(i, i + 1))) { return true; } } return false; } public static List<String> build(List<String> str, String[] arr) { List<String> result = new ArrayList<>(); for (int i = 0; i < str.size(); i++) { for (int j = 0; j < arr.length; j++) { result.add(str.get(i) + arr[j]); } } return result; } public static List<String[]> initList() { List<String[]> list = new ArrayList<>(); list.add(new String[]{"a", "b", "c"}); list.add(new String[]{"d", "e", "f"}); list.add(new String[]{"g", "h", "i"}); list.add(new String[]{"j", "k", "l"}); list.add(new String[]{"m", "n", "o"}); list.add(new String[]{"p", "q", "r"}); list.add(new String[]{"s", "t"}); list.add(new String[]{"u", "v"}); list.add(new String[]{"w", "x"}); list.add(new String[]{"y", "z"}); return list; } }