【限时免费】20天拿下华为OD笔试之 【不定滑窗】2023B-字符串摘要【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录

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

题目描述与示例

题目描述

给定一个字符串的摘要算法,请输出给定字符串的摘要值

  1. 去除字符串中非字母的符号
  2. 对于去除非字母符号后的字符串:
    1. 如果出现连续字符(不区分大小写),则输出: 该字母(小写) + 连续出现的次数
    2. 如果是非连续的字符(不区分大小写),则输出: 该字母(小写)之后字符串中出现的该字符的次数
  3. 对按照以上方式表示后的字符串进行排序:字母和紧随的数字作为一组进行排序,数字大的在前,数字相同的则按字母进行排序,字母小的在前。

输入描述

一行字符串,长度为[1,200]

输出描述

转换后的摘要字符串

示例一

输入

aabbcc

输出

a2b2c2

说明

示例二

输入

bAaAcBb

输出

a3b2b2c0

说明

第一个b非连续字母,该字母之后字符串中还出现了2次 (最后的两个Bb) ,所以输出b2

a连续出现3次,输出a3

c非连续,该字母之后字符串再没有出现过c,输出c0

Bb连续2次,输出b2

b2a3c0b2进行排序,最终输出a3b2b2c0

解题思路

去除非字母字符的操作非常简单,使用以下代码即可完成。

s = "".join(ch for ch in s if ch.isalpha())

每一个字符都会被摘要为字母+数字的形式。对于每一个字符ch,分为两种情况,若

  1. ch属于连续字母,那么后面的数字应该是本段连续字母的个数
  2. ch属于非连续字母,那么后面的数字应该是该ch右边的相同字母的个数

对于第一点,统计某一段连续字母的个数,可以用滑动窗口来解决这个问题。

对于第二点,储存每一个字符ch右边的相同字母的个数,很容想到用哈希表来储存元素个数,但需要从右往左遍历字符串s

正因为上述问题的存在,所以滑动窗口的过程不再是常规的right右移再动left右移,而是先令left左移再令right左移,即构建一个从右往左进行的滑动窗口

滑窗三问

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

**Q2:**右指针right移动到什么位置?

**Q3:**如何进行答案的更新?

滑窗三答

**A1:**将其与右指针right所指的元素s[right]进行比较

**A2:**右指针right移动到当前左指针left的位置,用于后续的继续判断

**A3:**右指针right所指字母和左指针letf所指字母不相同时,更新答案

代码

Python

# 题目:2023B-字符串摘要
# 分值:200
# 作者:许老师-闭着眼睛学数理化
# 算法:滑动窗口
# 代码看不懂的地方,请直接在群上提问# 用于更新答案的函数
def update(ans, dic, left, right, ch_right):# 当前窗口本段连续的ch的个数为right-leftnumContinue = right - left# 如果数量为1,说明本段窗口其实是非连续字母if numContinue == 1:# 储存该字符,以及该字符右边的相同字符的个数,储存在dic[ch_right]中ans.append((ch_right, dic[ch_right]))# 如果数量不为1,说明本段窗口是连续字母else:# 储存该字符,以及该字符连续出现的次数即numContinueans.append((ch_right, numContinue))# 将ch_right出现的次数更新在dic中,用于后续的继续判断dic[ch_right] += numContinuefrom collections import defaultdict# 输入字符串
s = input()
# 去除非字母字符
s = "".join(ch for ch in s if ch.isalpha())n = len(s)# 初始化答案列表
ans = list()
# 初始化哈希表,用于记录一个字符ch右边,出现的相同字符的个数
dic = defaultdict(int)# 初始化右指针
right = n-1
# 不同于传统的滑窗,要考虑一个从右往左滑动的滑动窗口
for left in range(n-1, -1, -1):# Q1:对于每一个左指针left所指的元素ch,做什么操作?# A1:将其与右指针right所指的元素s[right]进行比较ch = s[left].lower()ch_right = s[right].lower()# 如果两者是同一个字母(不区分大小写),# 说明当前窗口是一段连续的相同字符,则继续循环# 否则,需要进行right的左移和ans的修改if ch != ch_right:# Q3:如何进行答案的更新# A3:右指针right所指字母和左指针letf所指字母不相同时update(ans, dic, left, right, ch_right)# Q2:右指针移动到什么位置?# A2:右指针right移动到当前左指针left的位置,用于后续的继续判断right = left# A3:退出循环后,还需要最后再做一次答案的更新
# 因为最左边的相同连续字符串实际上并没有在上述循环中被考虑到
# 需要取left = -1,right-left才能得到符合要求的连续字母长度
update(ans, dic, -1, right, s[right].lower())# 退出循环,需要对ans中的元组进行排序
# 先按照数字降序排序,再按照字典序排序
ans.sort(key = lambda x: (-x[1], x[0]))
# 将ans中的二元组转为字符串,合并后输出
print("".join(item[0]+str(item[1]) for item in ans))

Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();String s = input.replaceAll("[^a-zA-Z]", "");int n = s.length();List<Map.Entry<Character, Integer>> ans = new ArrayList<>();Map<Character, Integer> dic = new HashMap<>();int right = n - 1;for (int left = n - 1; left >= 0; left--) {char ch = Character.toLowerCase(s.charAt(left));char chRight = Character.toLowerCase(s.charAt(right));if (ch != chRight) {update(ans, dic, left, right, chRight);right = left;}}update(ans, dic, -1, right, Character.toLowerCase(s.charAt(right)));ans.sort((a, b) -> {if (!a.getValue().equals(b.getValue())) {return b.getValue() - a.getValue();} else {return a.getKey() - b.getKey();}});StringBuilder result = new StringBuilder();for (Map.Entry<Character, Integer> item : ans) {result.append(item.getKey()).append(item.getValue());}System.out.println(result.toString());}public static void update(List<Map.Entry<Character, Integer>> ans, Map<Character, Integer> dic, int left, int right, char chRight) {int numContinue = right - left;if (numContinue == 1) {ans.add(new AbstractMap.SimpleEntry<>(chRight, dic.getOrDefault(chRight, 0)));} else {ans.add(new AbstractMap.SimpleEntry<>(chRight, numContinue));}dic.put(chRight, dic.getOrDefault(chRight, 0) + numContinue);}
}

C++

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;void update(vector<pair<char, int>>& ans, map<char, int>& dic, int left, int right, char chRight) {int numContinue = right - left;if (numContinue == 1) {ans.push_back(make_pair(chRight, dic[chRight]));} else {ans.push_back(make_pair(chRight, numContinue));}dic[chRight] += numContinue;
}int main() {string input;getline(cin, input);string s;for (char ch : input) {if (isalpha(ch)) {s += tolower(ch);}}int n = s.length();vector<pair<char, int>> ans;map<char, int> dic;int right = n - 1;for (int left = n - 1; left >= 0; left--) {char ch = tolower(s[left]);char chRight = tolower(s[right]);if (ch != chRight) {update(ans, dic, left, right, chRight);right = left;}}update(ans, dic, -1, right, tolower(s[right]));sort(ans.begin(), ans.end(), [](pair<char, int>& a, pair<char, int>& b) {if (a.second != b.second) {return b.second < a.second;} else {return a.first < b.first;}});string result;for (pair<char, int>& item : ans) {result += item.first + to_string(item.second);}cout << result << endl;return 0;
}

时空复杂度

时间复杂度:O(N)。仅需逆序遍历一次字符串s

空间复杂度:O(N)


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

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

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

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

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

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

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

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

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

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

相关文章

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

WPF如何实现应用程序托盘

在WPF中实现应用程序托盘图标和菜单功能通常需要使用System.Windows.Forms.NotifyIcon类&#xff0c;因为WPF本身并没有直接提供这样的控件。为了使用NotifyIcon&#xff0c;你需要添加对System.Windows.Forms的引用。以下是如何实现的步骤&#xff1a; 1. 添加对 System.Wind…

jedis连接redis

package com.wsd;import redis.clients.jedis.Jedis;import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Properties;public class Redis {public static void main(String[] args) {//读取properti…

Windows11 python3.12 安装pyqt6 pyqt6-tools

Windows11 python3.12 安装pyqt6比较容易&#xff0c;但pyqt6-tools一直安装不上去。出错信息如下&#xff1a; (venv) PS D:\python_project\pyqt6> pip install pyqt6-tools Collecting pyqt6-toolsUsing cached pyqt6_tools-6.4.2.3.3-py3-none-any.whl (29 kB) Collec…

思源笔记的优缺点 vs Obsidian vs Logseq vs Trilium

新用户对思源笔记的印象。&#xff08;PS&#xff1a;两年前我试用过思源笔记&#xff0c;被卡顿劝退了&#xff09; 优点 相比obsidian&#xff0c; 可在文档树拖拽 拖拽调整笔记顺序 拖拽使一个笔记成为另一个笔记的子笔记&#xff0c;树状结构 设置-文档树&#xff0c;默认…

homeassiant主题

下载主题 https://github.com/maartenpaauw/home-assistant-community-themes.git 使用file editor到homeassiant路径下&#xff0c;新建文件夹themes文件夹&#xff0c;用terminal新建也可以。 使用file editor上传文件 使用Terminal解压 mkdir themes unzip home-assistan…

Redis(消息队列Stream)

Stream是一个轻量级的消息队列。 Redis中Stream的作用是提供一种高效的消息传递机制&#xff0c;允许多个消费者并行地消费消息&#xff0c;并且不会重复消费已经处理过的消息。它可以用于实现分布式任务队列、日志收集、实时数据处理等场景。Redis中的Stream支持多个消费者组…

RabbitMQ 消息丢失解决 (高级发布确认、消息回退与重发、备份交换机)

目录 一、发布确认SpringBoot版本 确认机制图例&#xff1a; 代码实战&#xff1a; 代码架构图&#xff1a; 1.1交换机的发布确认 添加配置类 消息消费者 消息生产者发布消息后的回调接口 测试&#xff1a; 1.2回退消息并重发&#xff08;队列的发布确认&#xff09; …

windows 11 本地运行ER-NeRF及pytorch3D安装

ER-NeRF本地运行只要梳理好依赖版本&#xff0c;运行起来就很顺畅 conda create -n ernerf python3.10 创建本项目虚拟环境conda install pytorch1.12.1 torchvision0.13.1 cudatoolkit11.3 -c pytorch 若windows有多个版本的cuda&#xff0c;需要在环境变量中切换至cuda 11.3&…

使用composer安装ffmpeg的步骤

以下是使用composer安装ffmpeg的步骤&#xff1a; 1.在laravel根目录下执行以下命令安装ffmpeg&#xff1a; composer require php-ffmpeg/php-ffmpeg 2.如果不指定版本号&#xff0c;则默认使用0.14版本。 3.执行以上命令后&#xff0c;composer会自动下载并安装ffmpeg。 …

完整版解答!2023年数维杯国际大学生数学建模挑战赛B题

B题完整版全部5问&#xff0c;问题解答、代码&#xff0c;完整论文、模型的建立和求解、各种图表代码已更新&#xff01; 大家好&#xff0c;目前已完成2023数维杯国际赛B题全部5问的代码和完整论文已更新&#xff0c;部分展示如下&#xff1a; 部分解答图表 问题分析 B题前三…

TensorFlow案例学习:图片风格迁移

准备 官方教程&#xff1a; 任意风格的快速风格转换 模型下载地址&#xff1a; https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2 学习 加载要处理的内容图片和风格图片 # 用于将图像裁剪为方形def crop_center(image):# 图片原始形状shape image…

计算机视觉:人脸识别与检测

目录 前言 识别检测方法 本文方法 项目解析 完整代码及效果展示 前言 人脸识别作为一种生物特征识别技术&#xff0c;具有非侵扰性、非接触性、友好性和便捷性等优点。人脸识别通用的流程主要包括人脸检测、人脸裁剪、人脸校正、特征提取和人脸识别。人脸检测是从获取的图…

拼多多百亿补贴商品详情API接口系列

拼多多API接口是拼多多网提供的一种应用程序接口&#xff0c;允许开发者通过程序访问拼多多网站的数据和功能。通过拼多多API接口&#xff0c;开发者可以开发各种应用程序&#xff0c;如店铺管理工具、数据分析工具、购物比价工具等。在本章中&#xff0c;我们将介绍拼多多API接…

wpf devexpress 开始点

此教程示范如何创建registration form和DevExpress WPF Data Editors 开始点 此项目源码 这个解决方案包含几个项目-每一个项目对应一个教程 RegistrationForm.BaseProject项目是基于工作的解决方案。项目包含三个视图&#xff1a;MainView&#xff0c;RegistraionView&…

milvus数据库的数据管理-插入数据

一、插入数据 1.准备数据 数据必须与数据库中定义的字段元数据一致&#xff0c;与集合的模式匹配 import random data [[i for i in range(2000)],[str(i) for i in range(2000)],[i for i in range(10000, 12000)],[[random.random() for _ in range(2)] for _ in range(2…

安装最新版IntelliJ IDEA来开发Java应用程序

安装最新版IntelliJ IDEA来开发Java应用程序 Install the Latest Version of IntelliJ IDEA to Develop Java Applications 本文简要介绍如何安装配置JetBrains IntelliJ IDEA集成开发环境&#xff0c;从而开发Java应用程序&#xff1b;文中侧重实际操作和编程步骤&#xff0…

医院绩效考核系统源码 医院绩效考核系统方案

医院绩效考核系统源码 医院绩效考核系统是现代医院管理的重要方法和科学的管理工具。良好的绩效管理&#xff0c;有助于带动全院职工的工作积极性&#xff0c;有助于提高工作效率、提高医疗质量、改善服务水平、降低运营成本&#xff0c;全面提升医院的精细化管理水平。 医院绩…

ubuntu 23.04从源码编译安装rocm运行tensorflow-rocm

因为ubuntu22.04的RDP不支持声音转发&#xff0c;所以下载了ubuntu23.04.但官方的rocm二进制包最高只支持ubuntu22.04&#xff0c;不支持ubuntu 23.04&#xff0c;只能自己从源码编译虽然有网友告诉我可以用docker运行rocm。但是我已经研究了好几天&#xff0c;沉没成本太多&am…

【Linux】C文件系统详解(二)——什么是fd文件描述符以及理解“一切皆文件“

文章目录 fd-文件描述符如何深度理解"一切皆文件"**我们使用OS的本质:**FILEFILE是什么?谁提供的?和我们刚刚讲的内核的struct有关系吗FILE是一个结构体.该结构体内部一定要有以下字段:FILE是C语言标准库提供的.FILE和我们刚刚讲的内核的struct没有关系,最多就是上…