【2023C卷题限时免费】20天拿下华为OD笔试之 【不定滑窗】2023C-最长的指定瑕疵度的元音子串【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例一
      • 输入
      • 输出
      • 说明
    • 示例二
      • 输入
      • 输出
      • 说明
    • 示例三
      • 输入
      • 输出
      • 说明
  • 解题思路
    • 滑窗三问
    • 滑窗三答
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目描述与示例

题目描述

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

  • "a""aa"是元音字符串,其瑕疵度都为 0
  • "aiur"不是元音字符串(结尾不是元音字符)
  • "abira"是元音字符串,其瑕疵度为 2

给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出 0

子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入描述

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

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

输出描述

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

示例一

输入

0
asdbuiodevauufgh

输出

3

说明

满足条件的最长元音字符子串有两个,分别为uioauu,长度为 3

示例二

输入

2
aeueo

输出

0

说明

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

示例三

输入

1
aabeebuu

输出

1

说明

满足条件的最长元音字符子串有两个,分别为aabeeeebuu,长度为 5

解题思路

本题很显然是要找到一个最长的滑动窗口,窗口需要满足以下两个条件:

  1. 首尾的字符都是元音
  2. 窗口中的辅音个数不超过k个(即瑕疵度)

窗口的辅音个数,可以用一个变量win_consonant_num来维护即可。要特别注意一点,因为元音子串要求子串首尾的字符都是元音,我们必须固定left的位置始终指向一个元音,这使得

  1. left右移的条件会和常规的滑窗问题略有不同。
  2. 在开始滑窗时,必须先找到最左边的第一个元音作为left的起始位置以及滑窗的开始位置。

滑窗三问

Q1:对于每一个右指针right所指的元素ch,做什么操作?

Q2:什么时候要令左指针left右移?left对应的元素做什么操作?while中的循环不变量是什么?

Q3:什么时候进行ans的更新?

滑窗三答

A1:如果ch是一个辅音,则窗口中辅音个数win_consonant_num += 1

A2win_consonant_num > k,即滑窗子串所对应的瑕疵度超过了瑕疵度阈值kleft右移,直到left指向一个元音。

A3:如果ch是一个元音,且此时瑕疵度恰好为k,那么可以更新答案。

代码

Python

# 题目:【不定滑窗】2023C-最长的指定瑕疵度的元音子串
# 分值:200
# 作者:许老师-闭着眼睛学数理化
# 算法:不定滑窗
# 代码看不懂的地方,请直接在群上提问# 输入瑕疵度
k = int(input())
# 输入原字符串
s = input()# 构建包含元音的集合,用于快速判断某字符是不是元音
vowel_set = set("aeiouAEIOU")n = len(s)
# 初始化滑窗的左指针left是n
left = n
# 找到第一个元音
for i in range(n):if s[i] in vowel_set:left = ibreak# 如果经过上述循环后,left仍是n
# 说明s中不存在元音,也不存在符合要求的子串
# 直接输出0
if left == n:print(0)
else:ans = 0# 初始化滑窗中的辅音个数为0win_consonant_num = 0# 进行滑窗,从下标left开始滑窗for right, ch in enumerate(s[left:], left):# A3:如果ch是一个元音,且瑕疵度恰好为k,那么可以更新答案。if ch in vowel_set:if win_consonant_num == k:ans = max(ans, right-left+1)# A1:如果ch是一个辅音,则窗口中辅音个数win_consonant_num += 1else:win_consonant_num += 1# A2:即滑窗子串所对应的瑕疵度超过了瑕疵度阈值k,left右移,# 由于元音子串的首尾必须均为元音# 因此left需要持续右移直到以下两个条件均满足:# 1. win_consonant_num <= k# 2. s[left]指向一个元音while left < n and (win_consonant_num > k or s[left] not in vowel_set):if s[left] not in vowel_set:win_consonant_num -= 1left += 1# 退出循环,ans即为答案print(ans)

Java

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 输入瑕疵度int k = scanner.nextInt();scanner.nextLine();  // 读取换行符// 输入原字符串String s = scanner.nextLine();// 构建包含元音的集合Set<Character> vowelSet = new HashSet<>();vowelSet.add('a');vowelSet.add('e');vowelSet.add('i');vowelSet.add('o');vowelSet.add('u');vowelSet.add('A');vowelSet.add('E');vowelSet.add('I');vowelSet.add('O');vowelSet.add('U');int n = s.length();int left = n;// 找到第一个元音for (int i = 0; i < n; i++) {if (vowelSet.contains(s.charAt(i))) {left = i;break;}}// 如果不存在元音if (left == n) {System.out.println(0);} else {int ans = 0;int winConsonantNum = 0;for (int right = left; right < n; right++) {char ch = s.charAt(right);// 如果 ch 是元音if (vowelSet.contains(ch)) {if (winConsonantNum == k) {ans = Math.max(ans, right - left + 1);}} else {  // 如果 ch 是辅音winConsonantNum++;// 如果滑窗子串对应的瑕疵度超过了阈值 kwhile (left < n && (winConsonantNum > k || !vowelSet.contains(s.charAt(left)))) {if (!vowelSet.contains(s.charAt(left))) {winConsonantNum--;}left++;}}}// 输出结果System.out.println(ans);}}
}

C++

#include <iostream>
#include <unordered_set>
using namespace std;int main() {// 输入瑕疵度int k;cin >> k;// 输入原字符串string s;cin.ignore();  // 忽略换行符getline(cin, s);// 构建包含元音的集合unordered_set<char> vowelSet = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};int n = s.length();int left = n;// 找到第一个元音for (int i = 0; i < n; i++) {if (vowelSet.count(s[i]) == 1) {left = i;break;}}// 如果不存在元音if (left == n) {cout << 0 << endl;} else {int ans = 0;int winConsonantNum = 0;int start = left;for (int right = start; right < n; right++) {char ch = s[right];// 如果 ch 是元音if (vowelSet.count(ch)) {if (winConsonantNum == k) {ans = max(ans, right - left + 1);}} else {  // 如果 ch 是辅音winConsonantNum++;// 如果滑窗子串对应的瑕疵度超过了阈值 kwhile (left < n && (winConsonantNum > k || !vowelSet.count(s[left]))) {if (!vowelSet.count(s[left])) {winConsonantNum--;}left++;}}}// 输出结果cout << ans << endl;}return 0;
}

时空复杂度

时间复杂度:O(N)。仅需一次遍历数组。

空间复杂度:O(1)。仅需若干常数变量。

华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

小程序判断是否授权位置信息和手动授权

文章目录 概要微信小程序的&#xff0c;使用的是高德地图 概要 当用户来到页面之后就会弹出是否授权弹框&#xff0c;但是如果第一次关闭之后&#xff0c;下一次再过来的话页面的授权弹框就不出现了&#xff0c;针对于这种情况写了一个方法 微信小程序的&#xff0c;使用的是…

C#WPF数据触发器实例

本文讲解C#WPF数据触发器的实例 当绑定的数据满足某些条件时,数据触发器会执行某些操作 实例 创建项目 ListBox及触发器使用实例 UI界面 <Windowx:Class="TriggerDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q…

V10 桌面版、服务器版系统加固

V10 桌面版、服务器版系统加固 一、 文档说明 本文档中涉及的加固方法主要包括&#xff1a;密码策略配置、防火墙规 则配置、禁用高风险服务等。 二、 V10 桌面版系统加固 2.1 密码策略配置 密码策略包括密码老化控制策略和密码复杂度策略。密码老化 控制策略需要配置/etc…

【C++入门到精通】右值引用 | 完美转发 C++11 [ C++入门 ]

阅读导航 引言一、左值引用和右值引用1. 什么是左值&#xff1f;什么是左值引用&#xff1f;2. 什么是右值&#xff1f;什么是右值引用&#xff1f;3. move( )函数 二、左值引用与右值引用比较三、右值引用使用场景和意义四、完美转发std::forward 函数完美转发实际中的使用场景…

【LearnOpenGL基础入门——3】绘制纯色三角形

目录 一.写在前面 二.顶点输入 三.顶点着色器 四.编译着色器 五.片段着色器 六.着色器程序 七.链接顶点属性 彩蛋 一.写在前面 我们先认识一下OpenGL常用的几个名词&#xff1a; 顶点数组对象&#xff1a;Vertex Array Object&#xff0c;VAO顶点缓冲对象&#xff1a;…

2023全新付费进群系统源码 带定位完整版 附教程

这源码是我付费花钱买的分享给大家&#xff0c;功能完整。 搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;58soho.cn.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/conf…

linux配置固定ip(两种方法)

首先刚下载的vm&#xff0c;刚创建的虚拟机&#xff0c;肯定是需要配置ip的 其次以前我的每次都是设置自动ip&#xff0c;这样每次登录都会自动获取ip地址&#xff0c;并且每次的ip都不相同。 ~方法&#xff1a; 开机登陆后 1)Cd /etc/sysconfig/network-scripts 2)Vi ifcf…

Elasticsearch备份与还原:使用elasticdump

在数据管理的世界里&#xff0c;备份和还原数据是重中之重的日常工作&#xff0c;特别是对于Elasticsearch这样的强大而复杂的搜索引擎。备份不仅可以用于灾难恢复&#xff0c;还可以在数据迁移、测试或者升级等场景中发挥重要作用。 在本博客中&#xff0c;我们将会重点介绍如…

轻量级 Java 日志组件

日志记录功能在开发中很常用&#xff0c;不仅可以记录程序运行的细节&#xff0c;方便调试&#xff0c;也可以记录用户的行为&#xff0c;是框架中不可或缺的组件。为最大程度复用现有的组件&#xff0c;我们就地取材使用了 JDK 自带的 JUL&#xff08;java.util.logging&#…

Mybatis Plus公共字段自动填充

在多张表中同时存在创建时间、创建人、修改时间、修改人等字段&#xff0c;这些基础字段属于公共字段&#xff0c;那能不能对于这些公共字段在某个地方统一进行处理&#xff0c;从而简化开发&#xff0c;针对这个场景&#xff0c;就可以采用Mybatis Plus提供的公共字段自动填充…

聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收

【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩&#xff1a;整体营收达到10…

微信小程序H5 uniapp

最近微信小程序对有视频播放的审核严&#xff0c;需要提供“文娱类资质”。而申请这个资质比较繁琐。所以我们在小程序上用web-view做跳转到H5&#xff0c;H5使用uniapp编写。这是小程序关于web-view文档说明。https://developers.weixin.qq.com/miniprogram/dev/component/web…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

vue的生命周期分别是什么?

Vue的生命周期分为8个阶段&#xff0c;分别是&#xff1a; beforeCreate&#xff1a;实例初始化之后&#xff0c;数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created&#xff1a;实例已经创建完成后被调用&#xff0c;这时候实例已完成以下的配置&#…

asp.net core EF Sqlserver

一、EF CORE的使用 1、使用NuGet来安装EF CORE 使用程序包管理器控制台&#xff0c;进行命令安装 //安装 Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore //安装 Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityF…

Uniapp有奖猜歌游戏系统源码 带流量主

有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏,通过猜歌曲、观看广告赚取现金奖励。 本游戏基本特征如下: 1、玩家可以通过猜歌、做任务等方式直接获取现金奖励 2、玩家可以通过猜歌、拆红包、做任务等方式获取金币奖励,当金币累积到一定数量可以兑换现金 3…

产品运营的场景和运营策略

一、启动屏 1&#xff0e;概念 启动屏&#xff0c;特指 APP 产品启动时即显示的界面&#xff0c;这个界面一般会停留几秒钟时间&#xff0c;在这个时间内 APP 会在后台加载服务框架、启动各种服务 SDK 、获取用户地理位置、判断有无新版本、判断用户账户状态以及其他系统级别的…

微机原理_12

一、单项选择题(本大题共15小题,每小题3分&#xff0c;共45分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案。〕 十进制正数56的 8位二进制补码是()。 A. 00011001 B. 10100110 C. 10011001 D. 00100110 若栈顶的物理地址为20100H&#xff0c;当执行完指令PUSH…

qt 重载信号,使用““方式进行connect()调用解决方案

问题 在Qt中&#xff0c;重载的信号默认是无法使用&这种方式调用的。 因为&只能绑定到一个具体的信号&#xff0c;而重载的信号名称相同&#xff0c;编译器无法确定要绑定哪一个信号。 解决方案 如果非要使用&绑定重载的信号&#xff0c;可以使用函数指针进行转…