✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1、题目描述
- 2、输入描述
- 3、输出描述
- 补充说明:
- 4、Java算法源码
- 5. 测试
- 6.解题思路
1、题目描述
小王设计了一人简单的清字谈游戏,游戏的迷面是一人错误的单词,比如nesw,玩家需要猜出谈底库中正确的单词。猜中的要求如·
对于某个谜面和谜底单词,满足下面任一条件都表示猜中:
- 变换顺序以后一样的,比如通过变换w和e的顺序,“nwes”跟“news”是可以完全对应的;
- 字母去重以后是一样的,比如“woood”和“wood”是一样的,它们去重后都是“wod”请你写一个程序帮忙在谜底库中找到正确的谜底。迷面是多个单词,都需要找到对应的谜底,如果找不到的话,返"not found"。
2、输入描述
1、谜面单词列表,以",“分隔
2、谜底库单词列表,以”,"分隔
3、输出描述
匹配到的正确单词列表,以","分隔;
如果找不到,返回"not found"。
补充说明:
- 单词的数量N的范围:0<N<1000
- 词汇表的数量M的范围:0<M<1000
- 单词的长度P的范围:0<P<20
- 输入的字符只有小写英文字母,没有其它字符
4、Java算法源码
public static void main(String[] args) {Scanner sc = new Scanner(System.in);String values = sc.nextLine();String[] arr = values.split(",");values = sc.nextLine();String[] strs = values.split(",");List<byte[]> wordsList = new ArrayList<>();List<String> result = new ArrayList<>();for (String s : strs) {wordsList.add(s.getBytes());}for (String s : arr) {byte[] bytes = s.getBytes();int ok = 0;for (int i = 0; i < wordsList.size(); i++) {byte[] wordChars = wordsList.get(i);int has = 1;for (byte e : bytes) {int found = 0;for (byte w : wordChars) {if (w == e) {found = 1;break;}}if (found == 0) {has = 0;break;}}if (has == 1) {if (!result.contains(strs[i])) {result.add(strs[i]);ok = 1;break;}}}if (ok == 0) {result.add("not found");}}if (result.size() == 0) {System.out.print("not found");} else {for (int i = 0; i < result.size(); i++) {if (i == 0)System.out.print(result.get(i));elseSystem.out.print("," + result.get(i));}}
}
5. 测试
6.解题思路
- 首先,读取输入的迷面单词列表和谜底库单词列表。
- 将谜底库单词列表中的每个单词转换为字节数组,并将其存储在一个字节数组列表wordsList中。
- 遍历迷面单词列表中的每个单词,对于每个迷面单词,遍历谜底库单词列表中的每个单词。
- 将当前迷面单词和谜底库单词转换为字节数组,然后逐个比较字节数组中的字符。
- 如果迷面单词的每个字符在谜底库单词中都能找到匹配的字符,说明满足条件,将对应的谜底单词添加到结果列表result中。
- 如果遍历完所有谜底库单词后仍未找到匹配的谜底单词,则将"not found"添加到结果列表result中。
- 如果结果列表result为空,说明没有找到匹配的谜底单词,输出"not found"。
- 否则,将结果列表result中的单词按逗号分隔输出。