CCF CSP认证 历年题目自练Day50

题目

试题编号: 201809-3
试题名称: 元素选择器
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

题目分析(个人理解)

  1. 还是先理解题意,关于html的部分,可以按照样例画出树状图(html数据结构类似树,画图更清楚的明白子类父类的关系)。两个点就是第一层级,四个点就是第二层级,依次类推。
  2. 如图所示,框起来的就是后代选择器,查找要做的就是返回他们在html文档的行号。请添加图片描述
  3. 对于html的内容无非是查找时的选择器的种类不同,对于查找有三种情况:(1)单个标签选择器(2)单个id选择器(3)对于此题理解的有难度的地方在于出现后代选择器的情况,迭代选择器出现的情况有两种,第一种多个标签选择器,第二种多个ID选择器
  4. 做此类模拟题要根据输出选择输入内容的容器类型,(本人🌨️的教训)此题最后返回的是行数,又因为要判断标签还是id还是后代选择器还要判断父子关系,因此在存入html文档的内容时采用字典存储。存储每一行html文档的层级,标签和id选择器内容。对于查询语句的存储还是选择列表,利用split方法切分字符串,再用append方法追加写入即可。
  5. 下面进行判断,到底是查找的哪种情况,很容易,如果查询语句的长度是1则是ID或标签选择器;否则就是后代选择器。
  6. 之后利用函数分别实现三种选择器的方法,进入的参数是查询的语句,返回值是满足条件的行号。后面的代码注释写的非常清楚了,我就不多赘述。
  7. 上代码!!!
def Level(String):#此函数将实现存储html文档每一行的内容;并且以字典的形式返回缩进层级,标签和IDfor i in range(len(String)):if String[i] != '.':#统计表示缩进的符号breaklevel = i // 2#计算当前缩进label = ''#存储标签ID = ''#存储IDif len(String[i:].split()) == 1:#只有一个选择器label = String[i:]#写入else:#后代迭选择器label, ID = String[i:].split()#写入return {'level': level,'label': label, 'id': ID}row, test = map(int, input().split())#输入html总行号和测试数量
html = [None] # 存放html文档全部内容,位序表示行号;由于从一开始,列表位序从0开始所以,0号位用None占位html[]内的元素表示{'level': level,'label': label, 'id': ID}
#print(html)
for i in range(row):#输入html.append(Level(input()))#直接进入函数判断,注意返回的是字典
search = []#存放查询的操作
for i in range(test):search.append(list(input().split()))#存放到对应列表def LabelOrId(String):#判断是哪种选择器,ID还是标签temp = [0]#设置选择器个数初始值for i in range(1, len(html)):#遍历整个html文件的结构if String.lower() == html[i]['label'].lower() or String == html[i]['id']:#判断查询的标签是否在输入的html文档中;如果存在temp[0] += 1#temp[0]表示有几个选择器(IDorLabel)temp[1]表示行号;也就是temp[]存储的是每一行选择器的个数temp.append(i)return tempdef ParentRow(row):#利用缩进关系确定html文档的父子关系if row == 0:#html文档没内容return 0else:#有内容level = html[row]['level']#返回html文档最高缩进层数for i in range(row, 0, -1): # html第0位为Noneif html[i]['level'] == level - 1:#只相差一层则存在父节点;注意存在爷爷父亲儿子的情况(三级或更多)return i#返回父节点行号return 0 # 不存在父节点def Descendant(List):#后迭代选择器;参数是search[]row = []#存放合法的,满足条件的行数、行号(输出的内容)temp_answer = LabelOrId(List[-1])#前面都是相同的ID选择器或者元素选择器;返回的是最后一个选择器的行号for i in range(temp_answer[0]):#遍历html文档flag = []#利用此列表判断合法性son_row = temp_answer[i + 1]#返回子节点行号;family_row = [son_row]#把最小层级子节点行号存入family_row[]while True:parent_row = ParentRow(son_row)#返回存在子节点的行号if parent_row == 0:#没有子节点breakelse:family_row.append(parent_row)#把存在子节点的行号存入family_row[]son_row = parent_row#更新子节点行号family_row.reverse()#翻转;此时family_row[]的元素是从小到大的子节点行号j, k = 0, 0#j记录查询个数,k记录子节点个数while k < len(family_row):if List[j].lower() == html[family_row[k]]['label'].lower() or List[j] == html[family_row[k]]['id']:#判断输入合法性flag.append(True)k += 1j += 1if j >= len(List): breakelse:k += 1if flag == [True] * len(List):#全部合法row.append(temp_answer[i + 1])#返回子节点的行号l = len(row)row.insert(0, l)#等价于row[0]记录row的长度return rowresult = []
for i in range(test):if len(search[i]) == 1:#长度为一不存在迭代answer = LabelOrId(search[i][0]) # 标签和ID选择器result.append(answer)else:#迭代answer = Descendant(search[i]) # 后代选择器result.append(answer)for i in range(len(result)):#按照格式输出print(' '.join(map(str, result[i])))# 测试样例
'''
11 5
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p
'''

总结

Joker!
请添加图片描述

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

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

相关文章

【数据分析 | Numpy】Numpy模块系列指南(一),从设计架构说起

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

动态规划--整数拆分

题目描述 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释…

第十八章,Swing窗体

概述 String包的层次结构和继承关系如下 常用的Swing组件如下表 Swing常用窗体 JFrame 窗体 JFrame 类的常用构造方法包括以下两种形式&#xff1a; public JFrame&#xff08;&#xff09;&#xff1a;创建一个初始不可见、没有标题的窗体。 public JFrame(String title)&a…

Clickhouse Join

ClickHouse中的Hash Join, Parallel Hash Join, Grace Hash Join https://www.cnblogs.com/abclife/p/17579883.html https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3 总结 本文描述并比较了ClickHouse中基于内存哈希表的3种连接…

php请求okx接口获取比特币价格数据、k线数据

php请求okx接口获取比特币价格数据 环境配置请求头、签名设置签名配置代理 全部代码 环境 我本地用的是thinkphp框架和guzzle 安装guzzle composer require guzzlehttp/guzzle 配置请求头、签名 我们需要准备api_key&#xff0c;secret_key&#xff0c;passphrase api_key…

计网Lesson5 - MAC 地址与 ARP

文章目录 M A C MAC MAC 地址1. M A C MAC MAC 地址的格式 2. M A C MAC MAC 地址的获取3. A R P ARP ARP 协议4. A R P ARP ARP 缓存5. R A R P RARP RARP M A C MAC MAC 地址 1. M A C MAC MAC 地址的格式 每个网卡都有一个 6 6 6 字节的 M A C MAC MAC 地址 M A C…

爬虫从入门到精通(21) |字体加密通杀方案

文章目录 一、了解什么是字体加密二、Python打开字体加密文件三、字体加密的通杀1.静态的字体文件固定顺序的字体2.其他动态变化情况 一、了解什么是字体加密 字体加密是页面和前端字体文件想配合完成的一个反爬策略。通过css对其中一些重要数据进行加密&#xff0c;使我们在代…

【开源视频联动物联网平台】视频接入网关的用法

视频接入网关是一种功能强大的视频网关设备&#xff0c;能够解决各种视频接入、视频输出、视频转码和视频融合等问题。它可以在应急指挥、智慧融合等项目中发挥重要作用&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。 很多视频接入网关在接入协议…

zookeeper 单机伪集群搭建简单记录(实操课程系列)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper 1、官方下载加压后&#xff0c;根目录下新建data和log目录&#xff0c;然后分别拷贝两份&#xff0c;分别放到D盘&#xff0c;E盘&#xff0c;F盘 2、data目录下面…

hive创建ES外部表过程中的问题

一、缺少jar包&#xff1a;httpclient 报错&#xff1a; “HiveServer2-Handler-Pool: Thread-696” java.lang.NoClassDefFoundError: org/apache/commons/httpclient/protocol/ProtocolSocketFactory 需要加载commons-httpclient-3.1.jar 二、缺少jar包&#xff1a;eshado…

微服务实战系列之EhCache

前言 书接前文&#xff0c;继续深耕。上一篇博主对Redis进行了入门级介绍&#xff0c;大体知道了Redis可以干什么以及怎么使用它。 今日博主继续带着大家学习如何使用EhCache&#xff0c;这是一款基于Java的缓存框架。 微服务实战系列之Redis微服务实战系列之Cache微服务实战…

指针(2)

函数指针数组 函数指针数组是一个用来存放函数指针&#xff08;地址&#xff09;的数组。 如上图&#xff0c;是将两个函数指针存入数组中。如何写函数指针数组名呢&#xff1f;我们可以先写出函数指针类型int (*)(int,int)然后在(*)里面加上数组名[]即可。 指向函数指针数组…

ubuntu22.04识别CH340的问题汇总

一、目的 自己的电脑装的是双系统&#xff0c;ubuntu22.04安装了很久好久没有&#xff08;WSL2确实解决了频繁依赖linux的问题&#xff09;。昨天尝试搞一下STM32MP135的系统搭建&#xff0c;开始启用ubuntu22.04。但是遇到了很多问题&#xff0c;其中一个问题就是CH340的驱动…

Linux安全配置

进入ssh配置文件 vim /etc/ssh/sshd_config将port 22中的端口号改为5001 重启ssh服务 systemctl restart sshd拓展 sh与bash iptable与firewall ssh与sshd vps与ssh 参考&#xff1a; 【安全-SSH】SSH安全设置 - CSDN AppLinux VPS服务器SSH端口一键修改脚本​Linux脚本…

【课设大报告】 基于matlab gui设计的三极管学习系统

目录 设计背景 1.1设计目的 2.设计方法 2.1使用软件工具 2.2设计流程 3.模块界面设计及代码分析 3.1登录 3.2注册 3.3主菜单 3.4三极管介绍 3.5进制转换 3.6单位换算 3.7绘图 4.不足和改善 5.总结 设计背景 1.1设计目的 本程序旨在帮助为了帮助学生了解三极管…

C语言——有一个3*4的矩阵,要求求出其中值最大的那个元素的值,以及其所在的行号和列号

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j,row0,colum0,a[3][4]{{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};int maxa[0][0];for ( i 0; i < 3; i)//行&#xff08;row&#xff09;{for ( j 0; j < 4; j)//列&#xff08;colum&#xf…

【Python】基础练习题_组合数据类型_2

dictMenu f’卡布奇洛’:32,‘摩卡’:30,‘抹茶蛋糕’:28,‘布朗尼’:26}&#xff0c; dictMenu 中存放了你的双人下午套餐&#xff08;包括咖啡2份和点心2份)的价格,请编写程序,让Python帮忙计算并输出消费总额。 dictMenu {卡布奇洛: 32, 摩卡: 30, 抹茶蛋糕: 28, 布朗尼: 2…

【云平台】STM32微信小程序阿里云平台学习板

【云平台】STM32微信小程序阿里云平台学习板 文章目录 前言一、立创EDA&#xff08;硬件设计&#xff09;1.主控STM32F103C8T62.ESP8266模块3.温湿度模块4.光照强度模块5.OLED显示模块6.PCB正面7.PCB反面8.3D视角正面9.3D视角反面 二、【云平台】STM32微信小程序阿里云平台学习…

CentOS7 网络配置

前言&#xff1a; 安装虚拟机后&#xff0c;在虚拟机ping www.baidu.com ping不通。 一、centos7配置IP地址有两种方法&#xff1a; 动态获取IP&#xff08;不推荐使用&#xff09;设置静态ip&#xff08;推荐&#xff09; 二、centos7配置静态IP&#xff1a; 第一步&#xff…

使用npm发布typescript包

使用npm发布typescript包 什么是NPM NPM&#xff08;节点包管理器&#xff09;是 JavaScript 编程语言的默认包管理器。NPM 注册表是一个公共存储库&#xff0c;充当存储和分发 JavaScript 包的中心枢纽。它允许开发人员轻松安装、管理和共享可重用的 JavaScript 代码包&…