CCF CSP认证 历年题目自练Day50

2023-11-30 22:52

本文主要是介绍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!
请添加图片描述

这篇关于CCF CSP认证 历年题目自练Day50的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438846

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全管理器 DefaultSecurityManager: RememberMeManager:实现【记住我】功能

CCF推荐C类会议和期刊总结(计算机网络领域)

CCF推荐C类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属领域。 目录 CCF推荐C类会议和期刊总结(计算机网络领域) C类期刊 1. Ad Hoc Networks 2. CC 3. TNSM 4. IET Com