201809-3 元素选择器(100分)

2023-05-16

1、首先标签选择器和id选择器是很简单的,只需要注意标签大小写不敏感,id大小写敏感就可以拿到50分了

2、难的是后代选择器,按照题目给的思路,先找到所有满足最后一个选择器的元素列表,然后遍历这些元素,如果存在父级元素满足条件则继续搜索,否则说明这个元素不匹配选择器,将其移除。最后剩下的元素就是答案啦。

PS:作为一个人工智障,我不得不吐槽下我自己,这道题的考试的时候只拿了10分?。当时看题的时候自以为聪明,觉得题目给的后代选择器的筛选办法太费劲了,应该从第一个选择器开始筛选其子元素,惨痛的经验告诉我,还是少相信自己。

100分java代码如下

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static class Element implements Comparable<Element> {
        public String name;
        public String id;
        public int index;
        public int points;
        public List<Element> parents;

        public Element(String name, String id, int index, int points) {
            this.name = name.toLowerCase();
            this.id = id;
            this.index = index;
            this.points = points;
            this.parents = new ArrayList<>();
        }

        public static Element getElement(String line, int index) {
            String[] data = line.split(" ");
            String name = data[0];
            int points = name.lastIndexOf(".") + 1;
            name = name.substring(points);
            if (data.length == 1) {
                return new Element(name, "", index, points);
            } else {
                return new Element(name, data[1], index, points);
            }
        }

        @Override
        public int compareTo(Element o) {
            return this.index - o.index;
        }
    }

    private static List<Element> elements = new ArrayList<>();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] firstLine = scanner.nextLine().split(" ");
        int m = Integer.parseInt(firstLine[0]);
        int n = Integer.parseInt(firstLine[1]);
        for (int i = 0; i < m; i++) {
            elements.add(Element.getElement(scanner.nextLine(), i + 1));
        }
        List<String> queries = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            queries.add(scanner.nextLine());
        }
        scanner.close();


        for (String query : queries) {
            if (query.contains(" ")) {
                String[] selectors = query.split(" ");
                List<Element> children = getElements(selectors[selectors.length - 1]);
                List<Element> remove = new ArrayList<>();

                for (Element child : children) {
                    List<Element> currChildren = new ArrayList<>();
                    currChildren.add(child);
                    for (int i = selectors.length - 2; i >= 0; i--) {
                        String selector = selectors[i];
                        List<Element> parents = new ArrayList<>();
                        for (Element currChild : currChildren) {
                            parents.addAll(findValidParents(currChild, selector));
                        }

                        currChildren.clear();
                        currChildren.addAll(parents);

                        if(currChildren.size() == 0){
                            remove.add(child);
                            break;
                        }
                    }
                }

                children.removeAll(remove);
                printResult(children);
            } else {
                printResult(getElements(query));
            }
        }
    }


    private static List<Element> findValidParents(Element child, String selector) {
        List<Element> parents = new ArrayList<>();
        boolean isId = selector.startsWith("#");
        for (int i = child.index - 2; i >= 0; i--) {
            Element element = elements.get(i);
            if (element.points < child.points && isElementMatchSelector(element, selector, isId)) {
                parents.add(element);
            }
        }
        return parents;
    }

    private static List<Element> getElements(String selector) {
        List<Element> results = new ArrayList<>();
        boolean isId = selector.startsWith("#");
        for (Element element : elements) {
            if (isElementMatchSelector(element, selector, isId))
                results.add(element);
        }
        return results;
    }

    private static boolean isElementMatchSelector(Element element, String selector, boolean isId) {
        return (isId && element.id.equals(selector)) || (!isId && element.name.equals(selector.toLowerCase()));
    }

    private static void printResult(List<Element> results) {
        StringBuffer stringBuffer = new StringBuffer(results.size() + " ");
        for (Element element : results) {
            stringBuffer.append(element.index + " ");
        }
        System.out.println(stringBuffer.toString());
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

201809-3 元素选择器(100分) 的相关文章

随机推荐

  • Ubuntu配置阿里云ddns

    首发于yuany3721的WordPress 生成阿里云access key 注意 xff1a 不能使用ram子用户 下载并配置ddns curl https github com NewFuture DDNS releases downl
  • LibreOJ - 10015 扩散

    题目描述 一个点每过一个单位时间就会向 4 个方向扩散一个距离 xff0c 如图所示 xff1a 两个点 a b 连通 xff0c 记作 e a b xff0c 当且仅当 a b 的扩散区域有公共部分 连通块的定义是块内的任意两个点 u v
  • Python 生成器 (通俗讲解)

    一 生成器的本质 生成器是含有yield语句 xff08 或yield表达式 xff09 的函数所返回的对象 也就是说 xff0c 要创建一个生成器 xff0c 我们首先要定义一个函数 xff0c 该函数内将使用yield表达式或yield
  • (三)MNN与Opencl联合编译

    在MNN与opencl进行联合编译中 xff0c 需要注意一些事项 xff1a 1 在MNN中cmakelists进行修改后 2 在source backend opencl core runtime中OpenCLWarpper cpp中文
  • Linux文件系统操作命令

    一 目录类命令 ls 查看文件或目录的工具 xff0c 列出目录 用法 xff1a ls 选项 文件 选项 l 以长格式显示目录下的内容列表 输出的信息从左到右依次包括文件名 xff0c 文件类型 权限模式 硬连接数 所有者 组 文件大小和
  • Windows 11安装安卓子系统步骤

    1 win11开启虚拟平台 如下图 xff0c 进入设置界面 xff0c 应用 可选功能 更多 Windows 功能 勾选 Hyper V 和 虚拟机平台 xff0c 重启系统 2 下载安装子系统 打开地址 xff1a https stor
  • linux系统使用docker部署gitlab

    1 安装docker docker安装见我之前的文章 xff1a http t csdn cn H4wAm 2 拉取gitlab镜像 gitlab ce社区版最新版 docker pull gitlab gitlab ce latest g
  • ubuntu 18.10安装ssh软件

    ubuntu 18 10 ssh软件安装步骤 xff1a 输入 Ctrl 43 Alt 43 T 打开命令终端 xff1b 输入 sudo apt get update 更新源列表 xff1b 在输入命令后 xff0c 显示的是输入密码操作
  • Clion(2023)+QT(6.5)+cmake+vcpkg+Opencv(4.7)环境安装与使用

    用习惯了Clion xff0c 智能提示很棒 xff0c 就不想用Qt自带的creator编辑器 xff0c 并且新版的Clion支持编辑ui文件 于是搜罗了一下教程搭配一下环境安装 xff0c 其实最重要的还是cmakelist的编写 Q
  • QPushButton样式设置

    1 无样式的按钮 2 改变字体颜色 color span class token operator span ff0000 span class token punctuation span 3 改变字体 font span class t
  • linux进程间通信--共享内存(POSIX 版本)

    linux进程间通信 共享内存 POSIX 版本 System V共享内存模型使用的是key和标识符 xff0c 这与标准的UNIX I O模型使用文件名和描述符的做法不一致 这种差异导致System V共享内存段需要一整套全新的系统调用和
  • 软件工程 瀑布模型、原型模型、喷泉模型和V模型的优缺点及适用场景

    一 瀑布模型 瀑布模型 xff08 Waterfall Model xff09 是一个项目开发架构 xff0c 开发过程是通过设计一系列阶段顺序展开的 xff0c 从系统需求分析开始直到产品发布和维护 xff0c 每个阶段都会产生循环反馈
  • Ubuntu18.04 配置 Xrdp 远程桌面服务

    Ubuntu18 04 配置 Xrdp 远程桌面服务 Ubuntu18 04 配置 Xrdp 远程桌面服务安装桌面环境安装 Xrdp配置 Xrdp防火墙配置 1 连接远程桌面问题解决 2 参考链接 Ubuntu18 04 配置 Xrdp 远
  • linux系统中同时开启wifi与热点的办法

    如果你在linux操作系统中有同时开启wifi与热点的需求 xff0c 请按下面的办法操作 目前开启热点后会自动关闭wifi 同时开启wifi与热点的办法 1 准备工作 查看是否支持AP模式 iw list 找到这个 xff0c 表示支持A
  • Couldn't find executable named joy_node below /opt/ros/kinetic/share/joy解决方法

    最近想用joy node这个节点 xff0c 然后就通过 sudo apt get install ros kinetic joy 去安装 xff0c 然后运行rosrun joy joy node时候一直错误显示Segmentation
  • Android P中的AVB2.0校验

    avb校验功能主要是由external avb libavb库实现的 xff0c 该库主要完成的工作包括各个分区镜像的校验 xff0c 签名验证 xff0c 以及vbmeta数据的解析 xff0c 包括了各种flags的处理以及dm ver
  • linux:nohup命令用法

    启动示例 nohup java jar infos 1 0 0 jar gt dev null 2 gt amp 1 amp 这句命令的含义是 xff1a 使用nohup来启动 xff0c 并将日志输入到黑洞目录以实现不记录nohup ou
  • cas进行sso单点登录,解决重定向url中带 ;jsessionid=xxx,url路径不合法的问题

    cas进行sso单点登录时 解决重定向url中带 jsessionid 61 xxx url路径不合法的问题 Servlet3 0规范中的允许你定义JSESSIONID是存储在cookie中还是URL参数中 如果会话ID存储在URL中 xf
  • 将Sublime Text 3 打造成 C/C++编译器

    本文介绍Sublime Text 3的C C 43 43 开发环境搭建 xff0c 包括MinGW的安装 xff0c gcc运行c语言 xff0c g 43 43 运行c 43 43 语言 xff0c 在sublime中运行以及在cmd中运
  • 201809-3 元素选择器(100分)

    1 首先标签选择器和id选择器是很简单的 xff0c 只需要注意标签大小写不敏感 xff0c id大小写敏感就可以拿到50分了 2 难的是后代选择器 xff0c 按照题目给的思路 xff0c 先找到所有满足最后一个选择器的元素列表 xff0