华为OD机试: 38 寻找关键钥匙

package a_od_test;

import java.util.Arrays;
import java.util.Scanner;

/*
寻找关键钥匙
知识点亨符宰C:编程基础正则表达式^序
时间限制:1s空间限制:256MB限走语言:不限

题目描述:
小强正在参加《童室逃生》游戏,当前关卡要求找到符合给定麼码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

示例1
输入:
abc
s.sdf134 A2c4b
输出:
2
说明:
第2个箱子中的Abc符合密码abc

示例2
输入:
abc
s.sdf134 A2c4bd 523[]
输出:
-1
说明:
第2个箱子中的Abcd,与密码不完全匹配,不符合要求

解题思牆:
  1  将箱子中的字符串迸行遍历,找出其中的所有字母,井把大写转化为小写
  2. 将步骤1的宇符串转化为数组进行升序排序,再转化为字符串
  3. 将key和步骤2中的字符串逬行比较,如果相等则符合要求
 */
public class Main38 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line1 = sc.nextLine().toLowerCase();
        String[] split = sc.nextLine().split(" ");
        String[] split1 = line1.split("");
        Arrays.sort(split1);
        int result = -1;
        for (int i = 0; i < split.length; i++) {
            String word = split[i];
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < word.length(); j++) {
                char cur = word.charAt(j);
                if (Character.isLetter(cur)) {
                    sb.append(cur);
                }
            }

            String[] split2 = sb.toString().toLowerCase().split("");
            Arrays.sort(split2);

            if (Arrays.equals(split1, split2)) {
                result = i + 1;
            }
        }

        System.out.println(result);
    }
}

### 华为OD中路灯照明问题的技术要求与算法实现 #### 1. 题目背景 华为OD中的路灯照明问题是典型的区间覆盖类问题,主要考察考生对于贪心算法的理解以及实际应用能力。该问题通常涉及如何通过最少数量的路灯来完全照亮一段道路[^2]。 #### 2. 技术要求分析 在解决此类问题时,需满足以下几点技术要求: - **数据结构的选择**:应优先考虑使用数组或列表存储每盏路灯能够覆盖的道路范围。 - **算法设计原则**:采用贪心策略,在每次迭代过程中选择能覆盖当前未被照亮区域最远端的一盏路灯。 - **边界条件处理**:注意特殊情况下的输入验证,比如当没有任何路灯可以覆盖整个路段或者所有路灯都已足够覆盖目标区间的极端情况。 #### 3. Python 实现方案 以下是基于上述理论的一个具体实现: ```python def min_lamps(road_length, lamps): """ 计算所需最小路灯数以完全照亮指定长度的道路 参数: road_length (int): 需要被照亮的道路总长度 lamps (list of tuple[int]): 每个元组表示一盏路灯可照射的起始位置和结束位置 返回: int: 所需最少路灯数目;如果无法完成则返回 -1 """ if not lamps or max([lamp[1] for lamp in lamps]) < road_length: return -1 sorted_lamps = sorted(lamps, key=lambda x:x[0]) count = 0 current_end = 0 i = 0 n = len(sorted_lamps) while current_end < road_length and i < n: best_choice = None farthest_reach = current_end # 寻找最佳下一盏灯 while i < n and sorted_lamps[i][0] <= current_end: if sorted_lamps[i][1] > farthest_reach: best_choice = i farthest_reach = sorted_lamps[i][1] i += 1 if best_choice is None: break count += 1 current_end = farthest_reach return count if current_end >= road_length else -1 # 测用例 lamps_data = [(0, 5), (4, 9), (7, 12)] print(min_lamps(10, lamps_data)) # 输出应该是 2 ``` 此代码实现了计算至少需要多少盏路灯才能完全照亮一条固定长度的道路的功能,并附带了一个简单的测案例用于验证其正确性。 #### 4. 性能优化建议 为了提高程序运行效率,可以从以下几个方面入手: - 对原始灯具数据进行预处理并排序,减少后续查找过程中的比较次数; - 使用二分查找代替线性扫描寻找最优解的位置,进一步降低时间复杂度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值