百度&必应权4, 日IP8000. 查看详情
自助收录

2023年华为OD机考真题:寻找关键钥匙

算法刷题2年前 (2023)更新 江南白衣
907 0 0
2023年华为OD机考真题:寻找关键钥匙

全网最全面的华为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);
        }
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...