全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:寻找关键钥匙
题目描述:小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。
每个箱子中都有一个字符串s,字符串由大写字母,小写字母,数字,标点符号,空格组成,需要在这些字符串中找出所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号
提示:
满足条件的箱子不超过1个
输入描述:
第一行为key的字符串,第二行为箱子boxes,为数组样式,以空格分隔
箱子N数量满足1<=N<=10000,
s长度满足 0<=s.length<=50,
密码为仅包含小写字母的升序字符串,且不存在重复字母,
密码K长度K.length,1<=K.length<=26
输出描述:
返回对应箱子编号,如不存在符合要求的密码箱,则返回-1
补充说明:
箱子中字符拼出的字符串与密码的匹配忽略大小写,且要求与密码完全匹配,如密码abc匹配aBc,但是密码abc不匹配abcd
知识点:字符串编程基础正则表达式排序
时间限制:1s 空间限制:256MB 限定语言:不限
示例1
输入:
abc
s,sdf134 A2c4b
输出:
2
说明:
第2个箱子中的Abc,符合密码abc
示例2
输入:
abc
s,sdf134 A2c4bd 523[]
输出:
-1
说明:
第2个箱子中的Abcd,与密码不完全匹配,不符合要求
解题思路:
本题是站长在2023年2月份参加的华为OD机考原题的第1题,不需要复杂的算法,按照题目的要求按部就班的处理字符串就行了,考查的主要是对字符串常用方法的了解。解题可以分为三步操作:
第一步:对箱子中的字符串进行遍历,找出其中的所有字母,并把大写转化为小写
第二步:将步骤1的字符串转化为数组进行升序排序,再转化为字符串
第三步:将key和步骤2中的字符串进行比较,如果相等则符合要求
package com.codernav.demo.hwod.ques; import java.util.Arrays; import java.util.Scanner; /** * @title 寻找关键钥匙 * @Description 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。 * 每个箱子中都有一个字符串s,字符串由大写字母,小写字母,数字,标点符号,空格组成,需要在这些字符串中找出所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号 * @Author 开发者导航 * @website https://www.codernav.com * @date 2023/3/31 */ public class Main3 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String key = sc.nextLine(); String[] boxes = sc.nextLine().split(" "); int res = -1; for (int i = 0; i < boxes.length; i++) { String box = boxes[i]; String temp = ""; for (int j = 0; j < box.length(); j++) { char c = box.charAt(j); if (Character.isUpperCase(c)) { temp += Character.toLowerCase(c); //大写转化为小写 } else if (Character.isLowerCase(c)) { temp += c; } } char[] tempArr = temp.toCharArray(); //转换为数组 Arrays.sort(tempArr); //进行升序排序 if (String.valueOf(tempArr).equals(key)) { res = i + 1; break; } } System.out.println(res); } }
另外还有一种解法,供参考:
package com.codernav.demo.hwod.ques; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; /** * @title 寻找关键钥匙(解法二) * @Description 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。 * 每个箱子中都有一个字符串s,字符串由大写字母,小写字母,数字,标点符号,空格组成,需要在这些字符串中找出所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号 * @Author 开发者导航 * @website https://www.codernav.com * @date 2023/3/31 */ public class Main3_2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例 while (in.hasNextLine()) { String key = in.nextLine(); String s = in.nextLine(); String[] arr = s.split(" "); int index = -1; for (int i = 0; i < arr.length; i++) { List<Character> list = new ArrayList<>(); for (int j = 0; j < arr[i].length(); j++) { char c = arr[i].charAt(j); if (c >= 'a' && c <= 'z') list.add(c); if (c >= 'A' && c <= 'Z') list.add((char) (c - 'A' + 'a')); } list = list.stream().sorted().collect(Collectors.toList()); StringBuilder sb = new StringBuilder(); list.forEach(sb::append); if (sb.toString().equals(key)) index = i + 1; } System.out.println(index); } } }