(新卷,200分)- 模拟目录管理功能(Java JS Python C)

(新卷,200分)- 模拟目录管理功能(Java & JS & Python & C)


题目描述

实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。

支持命令:

  1. 创建目录命令:mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。
  2. 进入目录命令:cd 目录名称,如 cd abc 为进入abc目录,特别地,cd .. 为返回上级目录,如果目录不存在则不执行任何操作。此命令无输出。
  3. 查看当前所在路径命令:pwd,输出当前路径字符串。

约束:

  1. 目录名称仅支持小写字母;mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc;不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。
  2. 目录符号为/,根目录/作为初始目录。
  3. 任何不符合上述定义的无效命令不做任何处理并且无输出。
输入描述

输入 N 行字符串,每一行字符串是一条命令。

输出描述

输出最后一条命令运行结果字符串。

备注

命令行数限制100行以内,目录名称限制10个字符以内。

用例
输入mkdir abc
cd abc
pwd
输出/abc/
说明在根目录创建一个abc的目录并进入abc目录中查看当前目录路径,输出当前路径/abc/。
题目解析

本题感觉主要是考察树形结构定义,以及逻辑模拟。

目录结构,其实就是一个树形结构。一个父目录下面可以有多个直接子目录,而一个子目录只能有一个父目录。因此,本题需要定义出一个多叉树结构。

关于树节点定义如下:

class TreeNode {

String dicName; // 当前目录的名字

TreeNode father; // 当前目录的父目录

List<TreeNode> children; // 当前目录的子目录

}

接下来,就是实现目录管理能力:

  • mkdir
  • cd
  • pwd

实现这三个能力前,我们需要定义出树结构:

class Tree {

TreeNode root; // 树的根目录

TreeNode cur; // 当前所在目录

}

其中,tree.cur 用于指向当前所在目录,初始时 tree.cur = tree.root。

mkdir,其实就是在 tree.cur 目录下创建一个子目录,但是前提是 tree.cur 下面不存在对应子目录名,否则不操作。mkdir操作不改变 tree.cur 指向。


cd,有两种情况:

  1. cd ..

    cd .. 是返回上级目录(父目录),但是前提是 tree.cur.father 存在,否则不操作。如果 tree.cur.father 存在,则cd .. 会改变 tree.cur = tree.cur.father。
  2. cd 目录名

    cd 目录名 是进入子目录,但是前提是 tree.cur 包含对应目录名的子目录,否则不操作。如果 存在对应子目录,则 cd操作会改变 tree.cur = 对应子目录

pwd 是输出当前目录的路径字符串,我们可以不停进行 tree.cur = tree.cur.father 的倒序遍历,获取遍历过程中目录名tree.cur.dicName,直到 tree.cur == NULL。最后拼接时注意反转。


上面是目录管理功能的三个能力大致实现思路,具体实现根据不同语言有不同改进,比如 cd 目录名 功能,我们需要遍历 tree.cur.children 来确认对应目录名是否存在,这里Java,JS,Py定义 tree.cur.children 时可以使用 字典Map 来定义(key是目录名,val是对应目录名的TreeNode),从而实现快速查找对应目录。

另外,本题需要对mkdir, cd, pwd的命令参数做约束:

  • mkdir, cd 的参数只能是1个,如果超过1个,就不进行操作
  • pwd 不需要参数,如果有参数,就不进行操作
  • mkdir,cd的参数(目录名)只能由小写字母组成,否则不操作
  • mkdir,cd的参数(目录名)不能是嵌套路径,或者绝对路径
算法源码
JavaScript算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { class TreeNode { constructor(curDicName, father) { this.curDicName = curDicName; this.father = father; this.children = {}; } } class Tree { constructor() { // root是根目录,根目录 / 作为初始目录 this.root = new TreeNode("/", null); // cur用于指向当前正在操作的目录 this.cur = this.root; } mkdir(dicName) { // mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作 if (!this.cur.children[dicName]) { this.cur.children[dicName] = new TreeNode(dicName + "/", this.cur); } } cd(dicName) { if (dicName == "..") { // cd .. 为返回上级目录,如果目录不存在则不执行任何操作 if (this.cur.father != null) { // cur 变更指向上级目录 this.cur = this.cur.father; } } else { // cd 目录名称,如 cd abc 为进入abc目录,如果目录不存在则不执行任何操作 if (this.cur.children[dicName]) { // cur 变更指向下级目录 this.cur = this.cur.children[dicName]; } } } pwd() { // 输出当前路径字符串 const arr = []; // 倒序路径,即不停向上找父目录 let cur = this.cur; while (cur != null) { arr.push(cur.curDicName); cur = cur.father; } // 反转后拼接 return arr.reverse().join(""); } } // 初始化目录结构 const tree = new Tree(); // 记录最后一条命令的输出 let lastCommandOutPut = ""; outer: while (true) { try { const line = await readline(); // 本地测试解开此行 // if (line == "") break; const tmp = line.split(" "); const cmd_key = tmp[0]; if (cmd_key == "pwd") { // pwd 命令不需要参数 if (tmp.length != 1) continue; lastCommandOutPut = tree.pwd(); } else if (cmd_key == "mkdir" || cmd_key == "cd") { // 约束:mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc if (tmp.length != 2) continue; // 目录名 const cmd_val = tmp[1]; if (!(cmd_key == "cd" && cmd_val == "..")) { // 目录名约束校验 // 约束:目录名称仅支持小写字母 // 约束:不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。 // 关于嵌套路径和绝对路径,我简单理解就是cmd_val含有'/'字符,可以被小写字母判断涵盖住 for (let c of cmd_val) { if (c < "a" || c > "z") continue outer; } } if (cmd_key == "mkdir") { tree.mkdir(cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutPut = ""; } else { tree.cd(cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutPut = ""; } } } catch (e) { break; } } console.log(lastCommandOutPut); })();
Java算法源码
import java.util.HashMap; import java.util.Scanner; public class Main { static class TreeNode { String curDicName; TreeNode father; HashMap<String, TreeNode> children; public TreeNode(String curDicName, TreeNode father) { this.curDicName = curDicName; this.father = father; this.children = new HashMap<>(); } } static class Tree { TreeNode root; TreeNode cur; public Tree() { // root是根目录,根目录 / 作为初始目录 this.root = new TreeNode("/", null); // cur用于指向当前正在操作的目录 this.cur = root; } public void mkdir(String childDicName) { // mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作 this.cur.children.putIfAbsent( childDicName, new TreeNode(childDicName + "/", this.cur)); // 目录符号为 / } public void cd(String dicName) { if (dicName.equals("..")) { // cd .. 为返回上级目录,如果目录不存在则不执行任何操作 if (this.cur.father != null) { // cur 变更指向上级目录 this.cur = this.cur.father; } } else { // cd 目录名称,如 cd abc 为进入abc目录,如果目录不存在则不执行任何操作 if (this.cur.children.containsKey(dicName)) { // cur 变更指向下级目录 this.cur = this.cur.children.get(dicName); } } } public String pwd() { // 输出当前路径字符串 StringBuilder sb = new StringBuilder(); // 倒序路径,即不停向上找父目录 TreeNode cur = this.cur; while (cur != null) { // 头插目录名,保证路径中目录层级正确 sb.insert(0, cur.curDicName); cur = cur.father; } return sb.toString(); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 初始化目录结构 Tree tree = new Tree(); // 记录最后一条命令的输出 String lastCommandOutPut = ""; outer: while (sc.hasNextLine()) { String line = sc.nextLine(); // 本地测试解开此行 // if (line.equals("")) break; String[] tmp = line.split(" "); String cmd_key = tmp[0]; if (cmd_key.equals("pwd")) { // pwd 命令不需要参数 if (tmp.length != 1) continue; lastCommandOutPut = tree.pwd(); } else if (cmd_key.equals("mkdir") || cmd_key.equals("cd")) { // 约束:mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc if (tmp.length != 2) continue; // 目录名 String cmd_val = tmp[1]; if (!(cmd_key.equals("cd") && cmd_val.equals(".."))) { // 目录名约束校验 // 约束:目录名称仅支持小写字母 // 约束:不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。 // 关于嵌套路径和绝对路径,我简单理解就是cmd_val含有'/'字符,可以被小写字母判断涵盖住 for (int i = 0; i < cmd_val.length(); i++) { char c = cmd_val.charAt(i); if (c < 'a' || c > 'z') continue outer; } } if (cmd_key.equals("mkdir")) { tree.mkdir(cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutPut = ""; } else { tree.cd(cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutPut = ""; } } } System.out.println(lastCommandOutPut); } }
Python算法源码
class TreeNode: def __init__(self, curDicName, father): self.curDicName = curDicName self.father = father self.children = {} class Tree: def __init__(self): # root是根目录,根目录 / 作为初始目录 self.root = TreeNode("/", None) # cur用于指向当前正在操作的目录 self.cur = self.root def mkdir(self, dicName): # mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作 self.cur.children.setdefault(dicName, TreeNode(dicName + "/", self.cur)) # 目录符号为 / def cd(self, dicName): if dicName == "..": # cd .. 为返回上级目录,如果目录不存在则不执行任何操作 if self.cur.father is not None: # cur 变更指向上级目录 self.cur = self.cur.father else: # cd 目录名称,如 cd abc 为进入abc目录,如果目录不存在则不执行任何操作 if self.cur.children.get(dicName) is not None: # cur 变更指向下级目录 self.cur = self.cur.children[dicName] def pwd(self): # 输出当前路径字符串 lst = [] # 倒序路径,即不停向上找父目录 cur = self.cur while cur is not None: lst.append(cur.curDicName) cur = cur.father # 反转后拼接 lst.reverse() return "".join(lst) # 算法逻辑 # 初始化目录结构 tree = Tree() # 记录最后一条命令的输出 lastCommandOutput = "" while True: try: line = input() # 本地测试解开此行 # if line == "": # break tmp = line.split() cmd_key = tmp[0] if cmd_key == "pwd": # pwd 命令不需要参数 if len(tmp) != 1: continue lastCommandOutput = tree.pwd() elif cmd_key == "mkdir" or cmd_key == "cd": # 约束:mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc if len(tmp) != 2: continue # 目录名 cmd_val = tmp[1] # 目录名约束校验 # 约束:目录名称仅支持小写字母 # 约束:不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。 # 关于嵌套路径和绝对路径,我简单理解就是cmd_val含有'/'字符,可以被小写字母判断涵盖住 if not (cmd_val.isalpha() and cmd_val.islower()) and not (cmd_key == 'cd' and cmd_val == '..'): continue if cmd_key == "mkdir": tree.mkdir(cmd_val) # 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutput = "" else: tree.cd(cmd_val) # 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 lastCommandOutput = "" except: break print(lastCommandOutput)
C算法源码
#include <stdio.h> #include <stdlib.h> #include <string.h> /** 树节点 **/ typedef struct TreeNode { char curDicName[11]; // 当前目录名 struct TreeNode *father; // 父目录(只能有一个) struct LinkedList *children; // 子目录(可以有多个,这里使用链表记录) } TreeNode; /** 链表节点 **/ typedef struct ListNode { TreeNode *ele; // 链表用于记录多个子目录,因此链表节点的内容就是树节点 struct ListNode *next; } ListNode; /** 链表 **/ typedef struct LinkedList { ListNode *head; ListNode *tail; int size; } LinkedList; /** 树 **/ typedef struct Tree { TreeNode *root; // 记录树根节点 TreeNode *cur; // 记录当前目录对应的节点 } Tree; /** 链表结构方法 **/ // 初始化链表 LinkedList *new_LinkedList() { LinkedList *link = (LinkedList *) malloc(sizeof(LinkedList)); link->head = NULL; link->tail = NULL; link->size = 0; return link; } // 尾插链表 void addLast_LinkedList(LinkedList *link, TreeNode *ele) { ListNode *listNode = (ListNode *) malloc(sizeof(ListNode)); listNode->ele = ele; listNode->next = NULL; if(link->size == 0) { link->head = listNode; link->tail = listNode; } else { link->tail->next = listNode; link->tail = listNode; } link->size++; } // 遍历链表,获取指定节点的内容 TreeNode *get_LinkedList(LinkedList *link, char *dicName) { ListNode *curListNode = link->head; while (curListNode != NULL) { if (strcmp(curListNode->ele->curDicName, dicName) == 0) { return curListNode->ele; } curListNode = curListNode->next; } return NULL; } /** 树形结构方法 **/ TreeNode *new_TreeNode(char *curDicName, TreeNode *father) { TreeNode *treeNode = (TreeNode *) calloc(1, sizeof(TreeNode)); strcpy(treeNode->curDicName, curDicName); treeNode->father = father; treeNode->children = new_LinkedList(); return treeNode; } // 初始化树 Tree *new_Tree() { Tree *tree = (Tree *) malloc(sizeof(Tree)); // 由于目录名结尾都要带'/',因此可以认为根目录是空串,后期拼接时再尾部追加'/' // 另外根目录没有父目录,因此父目录设置为NULL tree->root = new_TreeNode("", NULL); // 初始时,当前目录就是根目录 tree->cur = tree->root; return tree; } // 创建指定目录 void mkdir_Tree(Tree *tree, char *dicName) { TreeNode *p = get_LinkedList(tree->cur->children, dicName); // mkdir 目录名称,如 mkdir abc 为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作 if (p != NULL) { return; } TreeNode *treeNode = new_TreeNode(dicName, tree->cur); addLast_LinkedList(tree->cur->children, treeNode); } // 跳转到指定目录 void cd_Tree(Tree *tree, char *dicName) { if (strcmp(dicName, "..") == 0) { // cd .. 为返回上级目录,如果目录不存在则不执行任何操作 if (tree->cur->father != NULL) { // cur 变更指向上级目录 tree->cur = tree->cur->father; } } else { TreeNode *p = get_LinkedList(tree->cur->children, dicName); // cd 目录名称,如 cd abc 为进入abc目录,如果目录不存在则不执行任何操作 if (p != NULL) { // cur 变更指向下级目录 tree->cur = p; } } } // 输出当前路径字符串 char *pwd_Tree(Tree *tree) { char *tmp = (char *) calloc(10000, sizeof(char)); char *res = (char *) calloc(10000, sizeof(char)); // 倒序路径,即不停向上找父目录 TreeNode *cur = tree->cur; while (cur != NULL) { strcpy(tmp, res); strcpy(res, cur->curDicName); strcat(res, "/"); strcat(res, tmp); cur = cur->father; } return res; } int main() { // 初始化目录结构 Tree *tree = new_Tree(); // 记录最后一条命令的输出 char lastCommandOutPut[10000]; char s[50]; while (gets(s)) { // 本地测试解开此行注释 if(strlen(s) == 0) break; char *cmd_key = strtok(s, " "); char *cmd_val = strtok(NULL, " "); if (strcmp(cmd_key, "pwd") == 0) { // pwd 命令不需要参数 if (cmd_val != NULL) { continue; } strcpy(lastCommandOutPut, pwd_Tree(tree)); } else if (strcmp(cmd_key, "mkdir") == 0 || strcmp(cmd_key, "cd") == 0) { // 约束:mkdir 和 cd 命令的参数仅支持单个目录,如:mkdir abc 和 cd abc if (cmd_val == NULL) continue; char *p = strtok(NULL, " "); if (p != NULL) continue; if(!(strcmp(cmd_key, "cd") == 0 && strcmp(cmd_val, "..") == 0)) { unsigned long long len = strlen(cmd_val); // 目录名约束校验 // 约束:目录名称仅支持小写字母 // 约束:不支持嵌套路径和绝对路径,如 mkdir abc/efg,cd abc/efg,mkdir /abc/efg,cd /abc/efg 是不支持的。 // 关于嵌套路径和绝对路径,我简单理解就是cmd_val含有'/'字符,可以被小写字母判断涵盖住 int i = 0; for (; i < len; i++) { char c = cmd_val[i]; if (c < 'a' || c > 'z') { break; } } if(i != len) { continue; } } if(strcmp(cmd_key, "mkdir") == 0) { mkdir_Tree(tree, cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 memset(lastCommandOutPut, '\0', strlen(lastCommandOutPut)); } else { cd_Tree(tree, cmd_val); // 题目进要求输出最后一个命令的运行结果,因此,对于无输出的命令,我认为需要覆盖掉前面的命令的输出结果 memset(lastCommandOutPut, '\0', strlen(lastCommandOutPut)); } } } puts(lastCommandOutPut); return 0; }

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

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

相关文章

HTML 语言代码:全面解析与使用指南

HTML 语言代码:全面解析与使用指南 引言 HTML,即超文本标记语言(HyperText Markup Language),是构成网页内容的基石。自从1990年由蒂姆伯纳斯-李发明以来,HTML一直是网络世界的标准语言。本文将全面解析HTML语言代码,涵盖其基本结构、常用标签、属性以及编写技巧,旨在…

全网最全专科生AI论文网站TOP10:开题报告文献综述必备工具

全网最全专科生AI论文网站TOP10&#xff1a;开题报告文献综述必备工具 2026年专科生AI论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上五花八门…

深度学习毕设项目推荐-基于python-cnn识别微小细胞细菌细胞器

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java中有哪些垃圾回收算法?

Java中的垃圾回收算法主要有3种&#xff0c;分别是标记-清除算法、复制算法、标记-整理算法。 1.标记-清除算法 这种算法的逻辑其实很简单&#xff0c;就是先遍历一遍&#xff0c;把有用的东西都打个勾✅&#xff08;标记&#xff09;&#xff0c;然后把那些没打勾的垃圾直接扔…

计算机深度学习毕设实战-机器学习基于cnn识别微小细胞细菌细胞器

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

二分搜索树的特性

二分搜索树的特性 引言 二分搜索树(Binary Search Tree,BST)是一种常见的树形数据结构,在计算机科学中有着广泛的应用。它是一种特殊的二叉树,具有以下特性:每个节点都有一个键值,左子树中的所有键值都小于该节点的键值,右子树中的所有键值都大于该节点的键值。本文将…

【计算机毕业设计案例】基于python深度学习的印刷体数字和字母识别基于深度学习的印刷体数字和字母识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Go 语言变量作用域

Go 语言变量作用域 引言 Go 语言(也称为 Golang)是一种广泛使用的静态强类型、编译型、并发型编程语言。变量是编程语言中用于存储数据的基本单元。理解变量的作用域对于编写高效且易于维护的代码至关重要。本文将深入探讨 Go 语言中变量的作用域,包括其定义、规则以及如何…

【苹果分级】机器视觉苹果质量检测及总分级系统【含GUI Matlab源码 14878期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

深度洞察!认知计算与提示工程融合,提示工程架构师的关键要点

深度洞察&#xff01;认知计算与提示工程融合&#xff1a;提示工程架构师的关键要点 前言&#xff1a;从“指令输入”到“认知协同”的范式转移 在大模型时代&#xff0c;我们对AI的期待早已超越“执行指令”——我们希望它能像人一样思考&#xff1a;能理解上下文、能分步推理…

2026继续教育必备!9个降AI率工具测评榜单

2026继续教育必备&#xff01;9个降AI率工具测评榜单 2026年继续教育者必备的降AI率工具测评 随着人工智能技术在学术领域的广泛应用&#xff0c;论文、报告等文字内容的AI检测标准愈发严格。对于继续教育群体而言&#xff0c;如何高效降低AI率已成为撰写高质量学术成果的关键环…

sqlite用的人多吗?

有个冷知识&#xff0c;微信就是依赖SQLite进行数据存储和管理的。 SQLite是一个轻量化的开源数据库&#xff0c;它没有服务器&#xff0c;无需复杂的配置安装&#xff0c;就可以直接用&#xff0c;很适合集成在APP、Web、小程序等应用里。 怎么安装和使用SQLite呢&#xff1f…

Chart.js 饼图:全面解析与实例教程

Chart.js 饼图:全面解析与实例教程 引言 Chart.js 是一个基于 HTML5 Canvas 的图表库,它可以帮助开发者轻松地在网页上创建各种类型的图表。其中,饼图是图表库中最常用的图表类型之一,用于展示数据占比情况。本文将详细介绍 Chart.js 饼图的使用方法,包括基本配置、交互…

瞧瞧别人家的Controller,那叫一个优雅

在实际工作中&#xff0c;我们需要经常跟第三方平台打交道&#xff0c;可能会对接第三方平台Controller接口&#xff0c;或者提供Controller接口给第三方平台调用。 那么问题来了&#xff0c;如果设计一个优雅的Controller接口&#xff0c;能够满足&#xff1a;安全性、可重复…

【计算机毕业设计案例】人工智能基于python深度学习的猫狗表情识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【必学的 10 个认知模型】认知的本质,快速提高认知,与高认知的人同行。人与人差距的本质。【通用智慧】

学的多&#xff0c;不如学的深刻&#xff01;&#xff01;&#xff01;通用的道&#xff0c;抽象成高级通用智慧。一处学习&#xff0c;处处受用。 提高认知 提高你“建模现实 纠错 迁移”的能力。认知不是学知识&#xff0c;而是&#xff1a;用更少的假设 → 更快看清结构 …

交通仿真软件:Aimsun_(13).行人与非机动车仿真

行人与非机动车仿真 行人仿真 行人仿真在交通仿真中是一个重要的组成部分&#xff0c;特别是在城市交通仿真中。Aimsun 提供了强大的行人仿真功能&#xff0c;可以模拟行人流量、行人行为和行人与车辆的交互。本节将详细介绍如何在 Aimsun 中进行行人仿真&#xff0c;包括行人网…

致同提示:财政部等九部委联合发布《企业可持续披露准则第1号——气候(试行)》

2025年12月25日&#xff0c;财政部会同生态环境部、外交部、国家发展改革委等九部门联合发布《企业可持续披露准则第1号——气候&#xff08;试行&#xff09;》&#xff08;以下简称《气候准则》&#xff09;&#xff0c;在实施范围和实施要求作出规定之前&#xff0c;由企业自…

SpringBoot 实现任意文件在线预览功能

一 文件在线预览在现代工作与生活环境中&#xff0c;文件共享与查看已经成为日常不可或缺的一部分。不过传统的文件处理方式要求用户下载文件到本地后才能查看&#xff0c;这不仅占用了设备的存储空间&#xff0c;还可能导致文件传播效率低下&#xff0c;甚至存在安全隐患。因此…

【人生分水岭】正复利与负复利重要的都有哪些?你不是缺努力,是缺“复利路径设计

绝大多数人的人生不是被一次决策毁掉的&#xff0c;而是被“长期负复利”慢慢拖垮的。 人生中最大的生存消费就是房子和车&#xff0c;都会越来越便宜&#xff0c;慎买二手。越晚买花得越少。除非必要和真的有钱。 无论是向正或向负&#xff0c;加上时间复利都会成为正或负的参…