最长的指定瑕疵度的元音子串 - 华为OD统一考试

news2025/3/13 21:50:44

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度。比如:

  • “a” 、 “aa” 是元音字符串,其瑕疵度都为0

  • “aiur” 不是元音字符串(结尾不是元音字符)

  • “abira” 是元音字符串,其瑕疵度为2

给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入描述

首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。

接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。

输出描述

输出为一个整数,代表满足条件的元音字符子串的长度。

示例1

输入:
0
asdbuiodevauufgh

输出:
3

说明:满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3。

示例2

输入:
2
aeueo

输出:
0

说明:没有满足条件的元音字符子串,输出0

示例3

输入:
1
aabeebuu

输出:
5

说明:满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5

题解

题目解析:

题目要求找到指定瑕疵度的最长元音字符子串,并输出其长度。首先,需要定义元音字符和瑕疵度的概念:

  • 元音字符: 题目中明确定义为aeiouAEIOU。
  • 瑕疵度表: 非元音字母的数量。
  • 元音字符下标: 维护元音字符下标位置,后续通过双指针方式去遍历元音下标更高效。

然后,通过滑动窗口的遍历字符串方式,维护一个左指针和右指针。在滑动窗口的过程中,不断调整左右指针,计算当前窗口内的瑕疵度,并判断是否满足预期的瑕疵度。最终,找到满足条件的最长元音字符子串的长度。

解题思路:

  1. 遍历字符串,将元音字符的下标存储起来。
  2. 使用滑动窗口,维护左右指针,计算窗口内的瑕疵度。
  3. 如果当前窗口的瑕疵度大于预期瑕疵度,则移动左指针,缩小窗口;否则,更新最长元音字符子串的长度。
  4. 最终输出最长元音字符子串的长度。

代码解释:

  • 使用一个瑕疵度表 flawCnt,记录每个位置的瑕疵度。
  • 将元音字符的下标存储在 vowelIdxs 列表中。
  • 遍历元音字符下标列表,通过滑动窗口计算瑕疵度,更新最长元音字符子串的长度。

Java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author code5bug
 */
public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int flaw = scanner.nextInt();
        String s = scanner.next();
        int n = s.length();
        int[] flawCnt = new int[n + 1]; // 瑕疵度表,flawCnt[x] 表示前 s[:x] 的瑕疵度
        Set<Character> vowels = "aeiouAEIOU".chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
        List<Integer> vowelIdxs = new ArrayList<>(); // 元音字符下标列表

        int cnt = 0;
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (vowels.contains(c)) { // 元音字符
                vowelIdxs.add(i);
            } else { // 非元音字母:瑕疵度 + 1
                cnt++;
            }
            flawCnt[i + 1] = cnt;
        }

        int l = 0, max_length = 0;
        for (int r = 0; r < vowelIdxs.size(); r++) {
            int right = vowelIdxs.get(r);
            while (l <= r) {
                int left = vowelIdxs.get(l);
                // 计算区间内的瑕疵度
                int curFlaw = flawCnt[right + 1] - flawCnt[left];
                if (curFlaw > flaw) { // 比预期的瑕疵度大,则左侧指针右移缩小窗口
                    l++;
                    continue;
                }
                if (curFlaw == flaw) max_length = Math.max(max_length, right - left + 1);
                break;
            }
        }

        System.out.println(max_length);
    }
}

Python

import string

def solve(flaw: int, s: string) -> int:
    """找出指定瑕疵度的最长元音字符子串,并返回其长度"""
    n = len(s)
    flaw_cnt = [0] * (n + 1)    # 瑕疵度表, flaw_cnt[x] 表示前 s[:x] 的瑕疵度
    vowels = set("aeiouAEIOU")
    vowel_idxs = []             # 元音字符下标列表

    cnt = 0
    for i, c in enumerate(s):
        if c in vowels:  # 元音字符
            vowel_idxs.append(i)
        else:  # 非元音字母:  瑕疵度 + 1
            cnt += 1
        flaw_cnt[i + 1] = cnt

    l, max_length = 0, 0
    for r in range(len(vowel_idxs)):
        right = vowel_idxs[r]
        while l <= r:
            left = vowel_idxs[l]
            # 计算区间内的瑕疵度
            cur_flaw = flaw_cnt[right + 1] - flaw_cnt[left]
            if cur_flaw > flaw:  # 比预期的瑕疵度大,则左侧指针右移缩小窗口
                l += 1
                continue
            if cur_flaw == flaw:
                max_length = max(max_length, right - left + 1)
            break

    return max_length


if __name__ == "__main__":
    flaw = int(input())
    s = input()
    print(solve(flaw, s))

C++

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int solve(int flaw, const string& s) {
    int n = s.length();
    vector<int> flaw_cnt(n + 1, 0); // 瑕疵度表,flaw_cnt[x] 表示前 s[:x] 的瑕疵度
    unordered_set<char> vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
    vector<int> vowel_idxs; // 元音字符下标列表

    int cnt = 0;
    for (int i = 0; i < n; i++) {
        char c = s[i];
        if (vowels.count(c)) { // 元音字符
            vowel_idxs.push_back(i);
        } else { // 非元音字母:瑕疵度 + 1
            cnt++;
        }
        flaw_cnt[i + 1] = cnt;
    }

    int max_length = 0;
    size_t l = 0;
    for (size_t r = 0; r < vowel_idxs.size(); r++) {
        int right = vowel_idxs[r];
        while (l <= r) {
            int left = vowel_idxs[l];
            // 计算区间内的瑕疵度
            int cur_flaw = flaw_cnt[right + 1] - flaw_cnt[left];
            if (cur_flaw > flaw) { // 比预期的瑕疵度大,则左侧指针右移缩小窗口
                l++;
                continue;
            }
            if (cur_flaw == flaw) max_length = max(max_length, right - left + 1);
            break;
        }
    }

    return max_length;
}

int main() {
    int flaw;
    cin >> flaw;
    string s;
    cin >> s;
    cout << solve(flaw, s) << endl;

    return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1427212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代&#xff0c;视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印&#xff0c;防止视频被盗用。水印作为数字版权保护技术的一种&#xff0c;可以有效地防止视频被非法复制、传播或篡改&#xff0c;从而保护创作者的权益和利益。下面我分享…

小程序中picker多列选择器

需求&#xff1a;实现类似省市联动的效果&#xff0c;选择第一列后&#xff0c;第二列数据变化 html部分: <view class"section"><view>多列选择器</view><picker mode"multiSelector" bindchange"bindMultiPickerChange"…

动环系统断电告警的防误报

机房一般接入的市电为三相380伏特&#xff0c;也有用单向220伏特的。UPS本身提供断电告警的功能&#xff0c;这个告警在各种种类的UPS中都是提供的&#xff0c;不同电压的市电输入都支持&#xff1b;三相电另外有缺相告警事件。但这些告警事件存在抖动或者误判。 瞬间的低压或…

C语言标准库所有字符串操作库函数汇总

以下是C语言标准库中字符串操作相关的API列表&#xff0c;这些函数通常在 <string.h> 头文件中定义&#xff1a; 1. strlen - 计算字符串长度&#xff0c;不包括结尾的空字符\0&#xff1a; size_t strlen(const char *str); 2. strcpy - 复制字符串&#xff1a; c…

网络编程套接字(3)

网络编程套接字 简单的TCP英译汉服务器地址转换函数字符串IP转整数IP整数IP转字符串IP关于inet_ntoa函数并发场景下的inet_ntoa函数绑定失败问题TCP协议通讯流程数据传输的过程数据交互四次挥手的过程端口连接 简单的TCP英译汉服务器 之前我们是以回调的方式处理任务的&#x…

再谈启动一个Activity大致时序图

太多了&#xff0c;笔者不想写&#xff0c; 读者可通过PlantUML插件查看如下PUML文件生成的时序图。 补充说明下&#xff0c;Android31版本。 startuml https://plantuml.com/sequence-diagram skinparam dpi 800 scale 15000 width scale 5000 heightautonumber Launcher La…

AJAX-入门

定义 概念&#xff1a;AJAX是浏览器与服务器进行数据通信的技术 使用 1.先使用axios库&#xff0c;与服务器进行数据通信 1&#xff09;基于XMLHttpRequest封装、代码简单、月下载量在14亿次 2&#xff09;Vue、React项目中都会用到axios 2.再学习XMLHttpRequest对象的使用…

学习日志以及个人总结 (16)

共用体 共用体 union 共用体名 { 成员列表&#xff1b; }&#xff1b;//表示定义一个共用体类型 注意&#xff1a; 1.共用体 初始化 --- 只能给一个值&#xff0c;默认是给到第一个成员变量 2.共用体成员变量辅助 3.可以判断大小端 ----※&#xff01;&#xff01; 实际用途…

Flask框架开发学习笔记《5》简易服务器代码

Flask框架开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后写清楚每个地址…

第96讲:MySQL高可用集群MHA的核心概念以及集群搭建

文章目录 1.MHA高可用数据库集群的核心概念1.1.主从复制架构的演变1.2.MHA简介以及架构1.3.MHA的软件结构1.4.MHA Manager组件的启动过程1.5.MHA高可用集群的原理 2.搭建MHA高可用数据库集群2.1.环境架构简介2.2.搭建基于GTID的主从复制集群2.2.1.在三台服务器中分别搭建MySQL实…

C#验证字符串是正整数还是负整数,正则表达式vs用Char.IsDigit 方法遍历字符数组

目录 一、使用的方法 1.正则表达式 2.Char.IsDigit 方法 二、源码 1.源代码 2.生成效果 一、使用的方法 1.正则表达式 使用正则表达式Regex类的IsMatch方法&#xff0c;可以有效地判断用户输入的信息是否为有符号整数。 用于判断字符串是否有符号整数的正则表达式…

Maya------显示隐藏提取复制刺破面

alth<--->ctrlshifth 补洞后刺破面&#xff0c;防止多边面的产生&#xff01;

【C/C++ 09】万年历

一、题目 输入一个年份&#xff0c;以日历的格式打印这一年的所有天数&#xff0c;需要正确的表示每一天是周几。 二、算法 以公元1年1月1日作为万年历的起始日期&#xff0c;公元1年1月1日是周一&#xff0c;所以算法的核心就是就算某一天距离起始日期的天数差&#xff0c;然…

Android14之Selinux报错:unknown type qemu_device at token (一百八十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

17.STL 库(C++)plus

STL 库&#xff08;C&#xff09; 文章目录 STL 库&#xff08;C&#xff09;1.迭代器1.1 概述和分类1.2案例 2.C 的 string 类型2.1string 概述2.2 string 构造函数2.3 string 赋值操作2.4string存取字符串操作2.5string拼接操作2.6 string 查找和替换2.7string 比较操作2.8st…

AJAX-axios错误处理

场景&#xff1a; 处理&#xff1a;用更直观的方式&#xff0c;给普通用户展示错误信息 语法&#xff1a;在then方法的后面&#xff0c;通过点语法调用catch方法&#xff0c;传入回调函数并定义形参 axios({//请求选项}).then(result> {//处理数据}).catch(error>{//处理…

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用&#xff1a; 实现按钮的文本切换 QStateMachine machine; //定义状态机&#xff08;头文件定义&#xff09;QState *off new QState(); //添加off 状态off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该…

2023_12蓝桥杯STEMA 考试 Scratch 中级试卷解析

2023蓝桥杯STEMA 考试 Scratch 中级试卷(12 月)解析 由于没有原始文件,这里使用的角色和背景和实际题目会有所差异,已经尽量还原原题,以下代码仅供参考。吐槽一句:蓝桥杯越来越变态了!\(`Δ’)/\(`Δ’)/\(`Δ’)/孩子学习速度永远也赶不上内卷的速度。 一、选择…

【axios报错异常】: Uncaught ReferenceError: axios is not defined

问题描述: 当前代码在vivo手机和小米手机运行是正常的,点击分享按钮调出相关弹框,发送接口进行分享,但是现在oppo手机出现了问题: 点击分享按钮没有反应. 问题解析: 安卓同事经过查询后,发现打印了错误: 但是不清楚这个问题是安卓端造成的还是前端造成的,大家都不清楚. 问题…

MySQL系列:系列结构和基础管理

文章目录 MySQL工作模型及实例MySQL 客户端/服务器工作模型&#xff08;C/S&#xff09;服务端&#xff1a;实例MySQLd的程序结构MySQL的逻辑结构MySQL的物理存储结构 MySQL基础管理用户管理权限管理连接管理初始化配置启动关闭多实例 MySQL工作模型及实例 MySQL 客户端/服务器…