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

urfread刷算法|构建一棵树

大意

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

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

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

相关文章:

urfread刷算法|构建一棵树

大意 示例标签串&#xff1a; 处理结果&#xff1a; 题目1 根据标签串创建树 需求 需求&#xff1a;给出一个字符串&#xff0c;将这个字符串转换为一棵树。 字符串可以在代码里见到&#xff0c;是以#开头&#xff0c;按照\分割的字符串。 你需要将这个字符串&#xff0…...

在卷积神经网络(CNN)中为什么可以使用多个较小的卷积核替代一个较大的卷积核,以达到相同的感受野

在卷积神经网络&#xff08;CNN&#xff09;中为什么可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的感受野 flyfish 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;可以使用多个较小的卷积核替代一个较大的卷积核&#xff0c;以达到相同的…...

【学习笔记】Mybatis-Plus(四):MP中内置的插件

内置插件 目前MP已经存在的内部插件包括如下&#xff1a; 插件类名作用PaginationInnerInterceptor分页插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor乐观锁插件。用于幂等性操作&#xff0c;采用版本更新记录DynamicTableNameInnerInterceptor动态表名Te…...

GlusterFS分布式存储系统

GlusterFS分布式存储系统 一&#xff0c;分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理&#xff0c;存储数据&#xff0c;而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长&#xff0c;单纯通过增加硬盘个数来扩展计算机文件系统的存储…...

微信公众平台测试账号本地微信功能测试说明

使用场景 在本地测试微信登录功能时&#xff0c;因为微信需要可以互联网访问的域名接口&#xff0c;所以本地使用花生壳做内网穿透&#xff0c;将前端服务的端口和后端服务端口进行绑定&#xff0c;获得花生壳提供的两个外网域名。 微信测试账号入口 绑定回调接口 回调接口的…...

Lua语言入门

目录 Lua语言1 搭建Lua开发环境1.1 安装Lua解释器WindowsLinux 1.2 IntelliJ安装Lua插件在线安装本地安装 2 Lua语法2.1 数据类型2.2 变量全局变量局部变量命名规范局部变量作用域 2.3 注释单行注释多行注释 2.4 赋值2.5 操作符数学操作符比较操作符逻辑操作符连接操作符取长度…...

卷积神经网络有哪些应用场景

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;的应用场景非常广泛&#xff0c;尤其是在处理具有网格结构的数据&#xff08;如图像、视频&#xff09;时表现出色。以下是一些主要的应用场景&#xff1a; 1. 图像识别与分类 图像分类…...

std::unordered_map和std::map在性能上有何不同

std::unordered_map和std::map在性能上的不同主要体现在以下几个方面&#xff1a; 1. 底层数据结构 std::unordered_map&#xff1a;基于哈希表实现&#xff0c;通过哈希函数计算元素的存储位置。哈希表能够直接通过哈希值快速定位到元素的位置&#xff0c;从而实现高效的查找…...

C++20中的基于范围的for循环(range-based for loop)

C11中引入了对基于范围的for循环(range-based for loop)的支持&#xff1a;该循环对一系列值(例如容器中的所有元素)进行操作。代码段如下&#xff1a; const std::vector<int> vec{ 1,2,3,4,5 }; for (const auto& i : vec)std::cout << i << ", …...

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…...

k8s-第七节-ConfigMap Secret

ConfigMap & Secret ConfigMap 数据库连接地址&#xff0c;这种可能根据部署环境变化的或者其他容器配置选项的包括容器更新或者扩容时可以统一配置 Kubernetes 为我们提供了 ConfigMap&#xff0c;可以方便的配置一些变量。 https://kubernetes.io/zh/docs/concepts/c…...

MySQL架构和工作流程

引言&#xff1a;MySQL执行一条sql语句期间发生了什么&#xff1f; 想要搞清楚这个问题&#xff0c;我们必须了解MySQL的体系结构和工作流程 一、MySQL体系结构 MySQL由以下几个部分组成 一、server层 1.MySQL Connnectors连接器&#xff0c;MySQL的连接池组件&#xff0c;…...

java项目总结8

1.方法引用 1.方法引用概述 注意注意&#xff1a; 1.引用出必须是函数式接口 2.被引用的方法必须已经存在 3.被引用方法的型参和返回值需要跟抽象方法保持一致 4.被引方法的功能要满足当前需求 Arrays.sort(arr,Main::subtraction); Main是该类的名称&#xff0c;&#xff1a…...

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要&#xff0c;特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验&#xff0c;还能确保使用安全。因此&#xff0c;保证锂电池单元…...

Spring Cloud Alibaba - Sentinel 分布式系统流量哨兵

目录 概述特征基本概念 安装Sentinel微服务引入Sentinel案例流控规则&#xff08;流量控制&#xff09;流控模式-直接流控模式-关联流控模式-链路流控效果-快速失败流控效果-预热WarmUp流控效果-排队等候 流控规则&#xff08;并发线程数控制&#xff09;熔断规则&#xff08;熔…...

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容&#xff0c;本章回中将介绍如何实现文件存储.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…...

数据结构/作业/2024/7/7

搭建个场景: 将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区)&#xff0c;并且实现封装函数︰1】顺序表的创建&#xff0c; 2】判满、 3】判空、 4】往顺序表里增加学生、5】遍历、 6】任意位置插入学生、7】任意位置删除学生、8】修改、 9】查找(按学生的学号查…...

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言 1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化&#xff0c;实现事务的隔离性&#xff0c;也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离性等级 2、通常用隔离级别来描述隔离性等级&#xff0c;以下将主要介绍ANSI 92标准…...

【数据结构与算法】希尔排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​...

【机器学习】(基础篇一) —— 什么是机器学习

什么是机器学习 本系列博客为你从机器学习的介绍开始&#xff0c;使用大量的代码实战和验证&#xff0c;最终帮助你完全掌握什么是机器学习 人工智能、机器学习和深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;是一门研…...

VitePress安装部署

VitePress安装部署 VitePress安装步骤 安装 Node环境 官网下载&#xff1a;https://nodejs.org/zh-cn 傻瓜式安装到完成 npm环境 安装完Node环境之后&#xff0c;可以直接运行下面的命令安装npm npm install -g pnpm关于pnpm源&#xff1a; 有时候需要国内源&#xff0c…...

Spring的事务传播机制和隔离级别

Spring 提供了强大的事务管理机制,通过 @Transactional 注解或程序化事务管理方式,开发者可以轻松地在应用中启用事务特性。事务传播机制和隔离级别是 Spring 事务管理中的两个重要方面,了解它们有助于更好地控制事务的行为,确保数据的一致性和完整性。 1. 事务传播机制(…...

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […...

antd实现简易相册,zdppy+vue3+antd实现前后端分离相册

前端代码 <template><a-image:preview"{ visible: false }":width"200"src"http://localhost:8889/download/1.jpg"click"visible true"/><div style"display: none"><a-image-preview-group:previe…...

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…...

陶建辉当选 GDOS 全球数据库及开源峰会荣誉顾问

近日&#xff0c;第二十三届 GOPS 全球运维大会暨 XOps 技术创新峰会在北京正式召开。本次会议重点议题方向包括开源数据库落地思考、金融数据库自主可控、云原生时代下数据库、数据库智能运维、数据库安全与隐私、开源数据库与治理。大会深入探讨这些方向&#xff0c;促进了数…...

Drools开源业务规则引擎(二)- Drools规则语言(DRL)

文章目录 1.DRL文件的组成&#xff1a;2.package3.import4.function5.query6.declare7.global8.rule8.1.规则属性8.2.LHS8.2.1.语法格式8.2.2.运算符优先级8.2.3.特殊的运算符1.matches, not matches2.contains, not contains3.memberOf, not memberOf4.in, notin5.soundslike6…...

PTA甲级1005:Spell It Right

错误代码&#xff1a; #include<iostream> #include<vector> #include<unordered_map> using namespace std;int main() {unordered_map<int, string> map {{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three&qu…...

Vue笔记11-Composition API的优势

Options API存在的问题 使用传统Options API中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里修改&#xff0c;而这些选项分布在代码的各个地方&#xff0c;中间还穿插着其他Optional API&#xff0c;如果代码量上来…...

rancher管理多个集群

一、rancher部署 单独部署到一台机器上&#xff0c;及独立于k8s集群之外&#xff1a; 删除所有yum源&#xff0c;重新建yum源&#xff1a; # 建centos7.9的yum源 # cat CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the …...