urfread刷算法|构建一棵树

news2024/11/15 21:04:51

大意

示例标签串:
在这里插入图片描述

处理结果:
在这里插入图片描述

题目1 根据标签串创建树

需求

需求:给出一个字符串,将这个字符串转换为一棵树。
字符串可以在代码里见到,是以#开头,按照\分割的字符串。
你需要将这个字符串,按照树存储为几个长标签串。
请自行编写存储完成后的展示代码。

package com.urfread.review.algorithm.tree;
import org.junit.jupiter.api.Test;

import java.util.List;
/**
 * 1.定义标签结点
 * 2.定义标签树
 * 3.根据标签串创建一棵树(你需要保证父标签id的正确性)
 * 4.输出一棵树的内容
 */
class TagNode {
    Tag tag;
    List<TagNode> children;
}
class Tag {
    String label;
    int parentId;
    int tagId;
}
class TagTree{
    Tag root;
}


public class TreeBuild {
    @Test
    public void buildTreeByStrTest(){
        // 示例标签串
        String tagString = "#计算机技术/编程语言/Java/注解/" +
                "#计算机技术/数据结构与算法分析/树/"+
                "#难度/基础/" +
                "#重要程度/一般/";
        TagNode rootNode =buildTreeByStr(tagString);
        // 自行编写输出展示的代码
    }
    public static TagNode buildTreeByStr(String str){
        TagNode rootNode = new TagNode();
        // START
        // 请在此编写代码

        // END
        return rootNode;
    }
}

实现思路

(以下给出代码,不能匹配这个练习题,这是我实际开发的时候编写的代码)
(只能当做是伪代码)

  1. 处理根节点。根节点不需要考虑标签内容,直接创建即可。
// 创建根节点
TreeNode rootNode = new TreeNode(null); // 根节点无需标签
rootNode.setTag(new Tag(0,"",0));//但还是给一个,以防空指针异常
  1. 为了保证标签id的正确性,所以做了特殊处理
int id = 1; // 标签节点的ID从1开始
lastTagIdMap.put(rootNode, id);//在方法外定义的HashMap。含义为:下一个被添加的结点的id。
  1. 在开始处理字符串之前,我们需要考虑这样一个问题,如何在树中添加一个结点?
    我们需要知道一些特征:添加到哪个结点的孩子中、添加的标签是什么。
    比如现在我们已经创建了根结点,那我们肯定会把下一个结点添加在根结点的孩子中;
    那么结点的内容怎么取?
    我们的标签是以#号开头的,所以去掉#就可以了。但是后边还连着一堆按\分割的子标签,那现在怎么办?
    我们首先按\将字符串分割为字符串数组,现在就可以放心的处理第一个结点了。
  2. 如何处理第二个结点?
    分情况,我们是该另开辟一条路径,还是接着刚才的结点往后续。
    区分依据就是看这个标签开头是不是#,如果是,那么就应该另开辟一条路径;如果不是就直接续。
    也就是说,我们需要保存上一个结点的引用,不然就不知道该把当前结点添加给谁当孩子了。
  3. 特殊情况处理

标签的id:记着手动增长。其实到后边,标签的id可以表示它加入到这课树中的顺序,在存到数据库时,可以进行特殊操作。

分叉:如果遇到两个标签串,前半部分一样,后来分叉怎么处理?如果一样,只移动结点指针,不再创建。

答案

package com.urfread.review.algorithm.tree;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Test;

import java.util.List;
/**
 * 1.定义标签结点
 * 2.定义标签树
 * 3.根据标签串创建一棵树 (你需要保证父标签id的正确性)
 * 4.输出处理结果
 */
@Data
@NoArgsConstructor
@Getter
class TagNode {
    Tag tag;
    List<TagNode> children;
    public TagNode(Tag tag) {
        this.tag = tag;
    }
    public void addChild(TagNode child) {
        if (children == null) {
            children = new java.util.LinkedList<>();
        }
        children.add(child);
    }
}
@Data
@AllArgsConstructor
class Tag {
    int tagId;
    String label;
    int parentId;
}
class TagTree{
    Tag root;
}


public class TreeBuild {
    @Test
    public void buildTreeByStrTest(){
        // 示例标签串
        String tagString = "#计算机技术/编程语言/Java/注解/" +
                "#计算机技术/数据结构与算法分析/树/"+
                "#难度/基础/" +
                "#重要程度/一般/";
        TagNode rootNode =buildTreeByStr(tagString);
        // 自行编写输出展示的代码
        printTree(rootNode);
    }
    public static TagNode buildTreeByStr(String tagStr){
        TagNode rootNode = new TagNode();
        // START
        // 请在此编写代码
        rootNode.setTag(new Tag(0,"",0));
        int id=1;

        String[]tags=tagStr.split("/");
        TagNode currentNode=rootNode;
        for(String tag:tags){
            if (tag.startsWith("#")){
                currentNode=rootNode;
                tag=tag.substring(1);
            }
            boolean isExist=false;
            if(currentNode.getChildren()!=null)
            // 判断是否已经插入
            for (TagNode child:currentNode.getChildren()){
                if (child.getTag().getLabel().equals(tag)){
                    // 如果已经存在,则只做移动指针的操作
                    currentNode=child;
                    isExist=true;
                    break;
                }
            }
            // 如果不存在,才会继续添加
            if (!isExist){
                TagNode newTagNode=new TagNode(new Tag(id++,tag,currentNode.getTag().getTagId()));
                currentNode.addChild(newTagNode);
                currentNode=newTagNode;
            }
        }
        // END
        return rootNode;
    }
    // 输出一棵树,请添加一些分级缩进
    public static void printTree(TagNode rootNode){
        // START
        // 请在此编写代码
        if (rootNode!=null&&rootNode.getChildren()!=null)
        for (TagNode child:rootNode.getChildren()){
            printTree(child,1);
        }
        // END
    }
    public static void printTree(TagNode rootNode,int level){
        if (rootNode!=null){
            for (int i=0;i<level;i++){
                System.out.print("  ");
            }
            System.out.println(rootNode.getTag().getLabel());
            if (rootNode.getChildren()!=null)
            for (TagNode child:rootNode.getChildren()){
                printTree(child,level+1);
            }
        }
    }
}


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

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

相关文章

详解COB封装的定义

COB封装全称是Chip on Board&#xff08;板上芯片封装&#xff09;&#xff0c;是一种非常先进的电子封装工艺&#xff0c;其会涉及到将发光芯片直接封装于印刷电路板&#xff08;PCB&#xff09;或者其他类型的互连电气基板上&#xff0c;通过细小的金属线进行键合&#xff0c…

golang出现panic: runtime error: index out of range [0] with length 0(创建n阶矩阵时)

本打算创建一个n阶的二维数组&#xff1a;以下两种情况都试了但都会出现如图片中的错误 ans : make([][]int, n)//① var ans [][]int //② 原因是初始化问题&#xff1a; 虽然创建了切片 ans&#xff0c;但是没有初始化其内部的切片。这会导致在尝试访问 ans[i][j] 等位置时出…

还是NC,项目代码开源|scRNA+bulkRNA+因子分析验证地塞米松治疗Covid19

说在前面 平时发文章的话&#xff0c;做药物用的大多都是仅仅是GEO的bulkRNA&#xff0c;有人的有鼠的&#xff0c;然后做做流水线分析&#xff0c;最后面PCR。今天看一篇发NC的工作量&#xff0c;怎么用转录组分析做药物的转化免疫学 这篇文章作者已经上传Github了&#xff…

vue3中使用弹幕组件vue-danmaku

1、最开始使用的是vue3-marquee&#xff0c;后面发现一直有一个bug无法解决&#xff0c;就是鼠标hover到第一个弹幕上字体就会变粗&#xff0c;已经提了issue给作者&#xff0c;但是目前还未答复&#xff0c;所以就换了方案。 地址如下&#xff1a; https://github.com/megasa…

Zoom视颊会议软件使用

GPT-3.5 (OpenAI) Zoom是一款极受欢迎的视频会议软件。使用Zoom可以方便地进行视频会议、远程授课、在线研讨会等活动。以下是Zoom的使用步骤&#xff1a; 1. 下载Zoom客户端 可以在Zoom官网上下载对应平台的Zoom客户端。下载并完成安装后&#xff0c;双击打开客户端。 2. 创建…

用Python制作动态钟表:实时显示时间的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制钟表函数主循环 完整代码 引言 动态钟表是一种直观且实用的UI元素&#xff0c;能够实时显示当前时间。在这篇博客中&#xff0c;我们将使用Python创建一个动态钟表&#xff0c;通过利用Pygame库来实…

动手学Avalonia:基于SemanticKernel与硅基流动构建AI聊天与翻译工具

Avalonia是什么&#xff1f; Avalonia是一个跨平台的UI框架&#xff0c;专为.NET开发打造&#xff0c;提供灵活的样式系统&#xff0c;支持Windows、macOS、Linux、iOS、Android及WebAssembly等多种平台。它已成熟并适合生产环境&#xff0c;被Schneider Electric、Unity、Jet…

高薪程序员必修课-Java中 ReentrantLock的公平锁和非公平锁底层实现原理

目录 前言 公平锁&#xff08;Fair Lock&#xff09; 原理 实现 示例代码 底层实现 非公平锁&#xff08;Non-Fair Lock&#xff09; 原理 实现 示例代码 底层实现 比较与选择 总结 ⭐️ 好书推荐 前言 在Java中&#xff0c;ReentrantLock 提供了公平锁和非公平锁…

详解 RisePro 信息窃密木马

RisePro 是一种窃密木马&#xff0c;以恶意软件即服务&#xff08;MaaS&#xff09;的模式在地下论坛出售。该恶意软件家族最早在 2022 年被发现&#xff0c;近期攻击行为快速增长。 RisePro 不依赖特定的感染媒介&#xff0c;可以通过多种方式植入失陷主机&#xff0c;通常使…

抖音本地生活服务商入驻流程须知指南!

近日&#xff0c;抖音发布关于新增《【到家外卖】内容服务商开放准入公告》的意见征集通知&#xff08;以下简称“通知”&#xff09;&#xff0c;并在其中公布了抖音外卖服务商入驻的一系列申请条件。在此背景下&#xff0c;许多想要成为抖音本地生活服务商的创业者在关注抖音…

java对象的访问定位的两种方式

句柄访问&#xff1a;reference中存储的稳定&#xff0c;对象实例位置改变&#xff0c;只需要改变句柄池中的对象实例指针 直接指针访问&#xff1a;HotSpot方式&#xff1a;效率高

【实验室优选】PP比色管 带刻度 聚丙烯试管 化学实验专用

PP比色管是一种实验室常用的容器&#xff0c;通常用于化学分析、比色实验、样品储存等。 以下是关于PP比色管的一些基本信息&#xff1a; 1. 材质&#xff1a; PP比色管由聚丙烯&#xff08;Polypropylene&#xff0c;简称PP&#xff09;材料制成&#xff0c;这种材料具有较高…

14-4 深入探究小型语言模型 (SLM)

大型语言模型 (LLM) 已经流行了一段时间。最近&#xff0c;小型语言模型 (SLM) 增强了我们处理和使用各种自然语言和编程语言的能力。但是&#xff0c;一些用户查询需要比在通用语言上训练的模型所能提供的更高的准确性和领域知识。此外&#xff0c;还需要定制小型语言模型&…

汇凯金业:数字货币对经济的影响有哪些

随着信息技术的飞速发展&#xff0c;数字货币作为一种新兴的货币形态&#xff0c;正逐步走进人们的视野&#xff0c;并对传统经济体系产生着深远影响。它不仅革新了交易方式&#xff0c;更在重塑金融格局、赋能经济发展等方面展现出巨大潜力。 一、交易效率的“加速器” 数字…

CentOS 7.9 快速更换 阿里云源教程

CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例&#xff0c;如果是其它版本或者系统的话&#…

适合职场小白的待办事项管理方法和工具

刚入职场那会儿&#xff0c;我每天都像只无头苍蝇&#xff0c;忙得团团转却效率低下。待办事项像潮水般涌来&#xff0c;会议、报告、客户跟进……每一项都像是悬在头顶的利剑&#xff0c;让我焦虑不堪。我深知&#xff0c;管理好待办事项是职场生存的必修课&#xff0c;但该如…

offer150-19:正则表达式匹配

问题描述&#xff1a;请实现用一个函数来匹配包含 “.” 和 “ * ”的正则表达式。模式中的字符.表示任意一个字符&#xff0c;而 ‘ * ’表示它前面的字符可以出现任意次(含0次&#xff09;。在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。例如&#xff0c;字符…

nginx访问图片报403的问题

在安装好nginx后&#xff0c; 编辑/etc/nginx/sites-available/default加上了如下内容&#xff1a; # 图片文件的位置location /images/ {alias /home/lighthouse/images/;autoindex on; # 可选&#xff0c;允许目录列表access_log off; # 可选&#xff0c;禁用访问日志记录…

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来&#xff1a;从高中生进化到,博士生&#xff1f; 随着近月GPT-4o的出世&#xff0c;OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中&#xff0c;美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…

LaTeX 编辑协作平台 Overleaf 安装和使用教程

在学术界和科技行业&#xff0c;LaTeX 已成为撰写高质量文档的标准工具。然而&#xff0c;传统的 LaTeX 使用体验常常伴随着以下挑战&#xff1a; 学习曲线陡峭环境配置复杂多人协作困难实时预览不便 当然&#xff0c;市面上不乏很多在线 LaTeX 编辑平台&#xff0c;但它们大…