当前位置: 首页 > news >正文

HackerRank C++面试,中等难度题目 - Attribute Parser

去除字符串首尾的空白字符(包括空格、制表符、换行符和回车符)

void trim(string &s) {size_t start = s.find_first_not_of(" \t\n\r");size_t end = s.find_last_not_of(" \t\n\r");if (start == string::npos) {s = "";} else {s = s.substr(start, end - start + 1);}
}
  • 参数: string &s - 传入的字符串引用,函数会直接修改该字符串。
  • 通过使用引用,你可以确保函数内部对字符串的修改直接影响到传入的原始字符串,而不是它的副本。这样可以避免额外的拷贝和内存分配。
  • 在C++中,find_first_not_of 和 find_last_not_of 是 std::string 类的成员函数,用于查找字符串中第一个或最后一个不匹配指定字符集的字符的位置。
  • 使用 find_first_not_of 方法找到字符串中第一个不是空格、制表符、换行符或回车符的字符位置。
  • 如果 start 等于 string::npos,说明整个字符串都是空白字符,将字符串置为空字符串。
  • 否则,使用 substr 方法提取从 start 到 end 之间的子字符串,并赋值给原字符串 s。

从格式化的属性字符串中提取键值对,并将其存储在一个向量中

vector<pair<string, string>> parse_attrs(const string &s) {// 初始化一个空的向量attrs用于存储解析后的键值对。vector<pair<string, string>> attrs;// 初始化位置指针pos为0,用于遍历输入字符串。在遍历数组或容器时,size_t 常被用作循环变量的类型,因为它能够处理所有可能的索引值。size_t pos = 0;while (pos < s.size()) {// 跳过字符串开头的所有空白字符。while (pos < s.size() && isspace(s[pos])) {pos++;}if (pos >= s.size()) {break;}// 查找下一个等号的位置,如果找不到则退出循环。size_t equal_pos = s.find('=', pos); // 查找字符串 s 中从位置 pos 开始的第一个等号('=')字符的位置。if (equal_pos == string::npos) {break;}string attr_name = s.substr(pos, equal_pos - pos);trim(attr_name);pos = equal_pos + 1;// 跳过等号后的所有空白字符。while (pos < s.size() && isspace(s[pos])) {pos++;}// 检查当前字符是否为双引号,如果不是则退出循环。if (pos >= s.size() || s[pos] != '"') {break;}pos++; // 找到下一个双引号的位置,提取其中的子字符串作为值。size_t value_start = pos;size_t value_end = s.find('"', pos);if (value_end == string::npos) {break;}string attr_value = s.substr(value_start, value_end - value_start);pos = value_end + 1; // 更新位置指针到双引号后的下一个字符。// 将解析出的键值对添加到向量中。attrs.emplace_back(attr_name, attr_value);}return attrs;
}
  • emplace_back: 这是 vector 类的一个成员函数,用于在容器的末尾直接构造元素。

main函数

int main() {// 读取两个整数N和Q,分别表示标签行数和查询次数。int N, Q;cin >> N >> Q;cin.ignore();// tag_stack用于存储当前打开的标签。vector<string> tag_stack;// attributes用于存储每个标签路径下的属性。unordered_map<string, unordered_map<string, string>> attributes;for (int i = 0; i < N; ++i) {string line;getline(cin, line);if (line.empty()) continue;// 如果遇到关闭标签(以</开头),则从tag_stack中弹出最后一个标签。if (line[1] == '/') {if (!tag_stack.empty()) {tag_stack.pop_back();}} else {line = line.substr(1, line.size() - 2); // 去掉字符串 line 的第一个字符和最后一个字符istringstream iss(line); // 创建了一个输入字符串流// 从字符串流 iss 中读取第一个单词(即标签名),并将其存储在 tag_name 变量中string tag_name;iss >> tag_name;// 从字符串流 iss 中读取剩余的内容(即标签的属性部分)string attr_str;getline(iss >> ws, attr_str); // 跳过任何前导空白字符(由 ws 表示)并读取直到行尾的所有内容// 从格式化的属性字符串中提取键值对,并将其存储在一个向量中vector<pair<string, string>> attrs = parse_attrs(attr_str);// 将当前的 tag_name 添加到 tag_stack 的末尾tag_stack.push_back(tag_name);// 构建一个表示当前标签路径的字符串string current_path;for (const string& tag : tag_stack) {if (!current_path.empty()) {current_path += ".";}current_path += tag;}for (const auto& attr : attrs) {attributes[current_path][attr.first] = attr.second;}}}for (int i = 0; i < Q; ++i) {string query;getline(cin, query);size_t tilde_pos = query.find('~');if (tilde_pos == string::npos) {cout << "Not Found!" << endl;continue;}string path = query.substr(0, tilde_pos);string attr = query.substr(tilde_pos + 1);// 确保在 attributes 中存在指定的路径 path,并且在这个路径下存在指定的属性 attr。if (attributes.find(path) != attributes.end() && attributes[path].find(attr) != attributes[path].end()) {cout << attributes[path][attr] << endl;} else {cout << "Not Found!" << endl;}}return 0;
}
  • unordered_map<string, unordered_map<string, string>> attributes; 是一个嵌套的哈希表(也称为字典或映射),用于存储HTML标签的属性。
  • getline 函数从输入流 cin 中读取字符,直到遇到换行符(‘\n’),但不包括换行符。读取的字符被存储到字符串 line 中。
  • attributes.find(path) 尝试在 attributes 中找到键为 path 的元素。
    如果找到了这个路径,find 方法返回一个迭代器,指向找到的元素;否则,返回 attributes.end()。
  • 然后,attributes[path].find(attr) 尝试在这个内部的 unordered_map 中找到键为 attr 的元素。
  • 同样地,如果找到了这个属性,find 方法返回一个迭代器,指向找到的元素;否则,返回 attributes[path].end()。

相关文章:

HackerRank C++面试,中等难度题目 - Attribute Parser

去除字符串首尾的空白字符&#xff08;包括空格、制表符、换行符和回车符&#xff09; void trim(string &s) {size_t start s.find_first_not_of(" \t\n\r");size_t end s.find_last_not_of(" \t\n\r");if (start string::npos) {s ""…...

【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题

1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型&#xff0c;只有Core 0是上电状态&#xff0c;而Core 1处于掉电状态&#xff0c;如图2-1所示&#xff1a; 图2-1 3、软硬件环境 1&#xff09;…...

节目选择器安卓软件编写(针对老年人)

文章目录 需求来源软件界面演示效果源码获取 对爬虫、逆向感兴趣的同学可以查看文章&#xff0c;一对一小班教学&#xff1a;https://blog.csdn.net/weixin_35770067/article/details/142514698 需求来源 由于现在的视频软件过于复杂&#xff0c;某客户想开发一个针对老年人、…...

蓝桥杯之图

图&#xff1a; 对于图来说&#xff0c;重点在于之后的最短路径算法&#xff0c;这边简单做一下了解即可 代码&#xff1a; #include<iostream> #include<string> #include<vector> #include<list> #include<queue> using namespace std; clas…...

中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号

前言 请先阅读上一篇博客获取到光猫超级密码电信光猫获取超级密码 电信光猫天翼网关4.0获取超级密码教程 四川电信光猫 中兴 F1855V2 ZXHN F1855V2 telent权限 实战 实测_天翼4.0光猫超级密码-CSDN博客 修改SN-修改地区&#xff0c;光猫异地注册&#xff0c;设置桥接模式&#…...

【kafka系列】Kafka如何保证消息不丢失?

目录 1. 生产者端&#xff1a;确保消息成功发送到Broker 核心机制&#xff1a; 关键步骤&#xff1a; 2. Broker端&#xff1a;持久化与副本同步 核心机制&#xff1a; 关键源码逻辑&#xff1a; 3. 消费者端&#xff1a;可靠消费与Offset提交 核心机制&#xff1a; 关…...

AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python

AtCoder Beginner Contest 393 E - GCD of Subset Problem Statement You are given a sequence A ( A 1 , A 2 , … , A N ) A (A_1, A_2, \dots, A_N) A(A1​,A2​,…,AN​) of length N N N and a positive integer K K K (at most N N N). For each i 1 , 2 , … …...

vue3响应式丢失解决办法(三)

vue3的响应式的理解&#xff0c;与普通对象的区别&#xff08;一&#xff09; vue3 分析总结响应式丢失问题原因&#xff08;二&#xff09; 经过前面2篇文章&#xff0c;知道了响应式为什么丢失了&#xff0c;但是还是碰到了丢失情况&#xff0c;并且通过之前的内容还不能解…...

BY组态:构建灵活、可扩展的自动化系统

引言 在现代工业自动化领域&#xff0c;BY组态&#xff08;Build Your Own Configuration&#xff09;作为一种灵活、可扩展的解决方案&#xff0c;正逐渐成为工程师和系统集成商的首选。BY组态允许用户根据具体需求自定义系统配置&#xff0c;从而优化生产效率、降低成本并提…...

2025 (ISC)²CCSP 回忆录

2025.1.20 广州&#xff0c;周一&#xff0c;我一次性通过了CCSP的考试。 为什么要考证&#xff1f; 个人成长所需 职业热情&#xff1a;做一行爱一行&#xff0c;既然我投入了美好的青春年华到网络安全行业当中&#xff0c;那么对于这个行业最有权威的认证&#xff0c;是肯定…...

强化学习笔记7——DDPG到TD3

前提&#xff1a;基于TD 的方法多少都会有高估问题&#xff0c;即Q值偏大。原因两个&#xff1a;一、TD目标是真实动作的高估。 二&#xff1a;自举法高估。 DDPG 属于AC方法&#xff1a;异策略&#xff0c;适合连续动作空间&#xff0c;因为他的策略网络直接输出的动作&#…...

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘&#xff0c;以及后续的模型数据下载也在C盘&#xff0c;导致会占用C盘空间&#xff0c;所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…...

-bash:/usr/bin/rm: Argument list too long 解决办法

问题概述 小文件日志太多导致无法使用rm命令&#xff0c;因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件&#xff0c;文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下&#xff1a; 使用find -exec 遍历&#xff0c;然后执行删…...

内容中台重构企业内容管理流程驱动智能协作升级

内容概要 内容中台作为企业数字化转型的核心基础设施&#xff0c;通过技术架构革新与功能模块整合&#xff0c;重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系&#xff0c;将分散的创作、存储、审核及分发环节纳入统一平台管理。基…...

python实现YouTube关键词爬虫(2025/02/11)

在当今数字化时代&#xff0c;YouTube作为全球最大的视频分享平台之一&#xff0c;拥有海量的视频资源。无论是进行市场调研、内容创作还是学术研究&#xff0c;能够高效地获取YouTube上的相关视频信息都显得尤为重要。今天&#xff0c;我将为大家介绍一个基于Python实现的YouT…...

【效率技巧】怎么做思维导图||数学思维||费曼学习法

目录标题 常见问题&#xff1a;认知误区和建议&#xff1a;思维导图按照功能分类思维导图好处步骤&#xff08;拆解的步骤&#xff09; 常见问题&#xff1a; 1、做好的思维导图浪费时间 2、做简单的思维导图没有效果 认知误区和建议&#xff1a; 1、做思维导图工具&#xf…...

LabVIEW与USB设备开发

开发一台USB设备并使用LabVIEW进行上位机开发&#xff0c;涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输&#xff0c;帮助用户顺利完成项目开发。下面是一个详细的说明&…...

动态规划LeetCode-416.分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...

云原生(五十五) | ECS中自建数据库迁移到RDS

文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…...

【吾爱出品】 视频批量分段工具

视频批量分段工具 链接&#xff1a;https://pan.xunlei.com/s/VOJDvtHQE7GOiJ84WNea5Ay1A1?pwd5nta# 选择视频文件 启动程序后&#xff0c;点击 "文件" 菜单下的 "选择视频文件" 按钮&#xff0c;或者直接将视频文件拖放到程序窗口中的视频列表区域。支…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...