【华为OD-E卷 - 单词接龙 100分(python、java、c++、js、c)】
【华为OD-E卷 - 单词接龙 100分(python、java、c++、js、c)】
题目
单词接龙的规则是:
可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。 现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,
请输出最长的单词串,单词串是单词拼接而成,中间没有空格
输入描述
- 输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N ; 输入的第二行为一个非负整数,表示单词的个数N; 接下来的N行,分别表示单词数组中的单词
输出描述
- 输出一个字符串,表示最终拼接的单词串
备注
- 单词个数N的取值范围为[1, 20]; 单个单词的长度的取值范围为[1, 30]
用例
用例一:
输入:
0
6
word
dd
da
dc
dword
d
输出:
worddwordda
用例二:
输入:
4
6
word
dd
da
dc
dword
d
输出:
dwordda
python解法
- 解题思路:
- 解析输入
读取标准输入 sys.stdin.read() 并用 split() 按空格分割成 data 列表。
data[0] 为起始索引 k,data[1] 为单词数量 n,data[2:] 为 n 个单词组成的列表 words。
构造最长单词链
初始化:
result 存储最终的单词链,从索引 k 的单词开始。
words[k] 设为 None,表示已使用。
使用 groups 组织未使用的单词,以首字母为键,将同一首字母的单词存入 最大堆(heapq 的 Python 版本默认是最小堆,存入时取负号转换为最大堆)。
构造最长链:
取 result[-1] 的最后一个字母 last_char,从 groups 取出最长的可连接单词 nxt,并加入 result。
若 last_char 在 groups 但 heapq 为空,则终止构造。
返回结果
将 result 列表拼接成字符串并返回。
使用到的算法
最大堆(heapq)
用 heapq.heappush(groups[w[0]], (-len(w), w)) 维护每个首字母对应的最长单词,以 负长度 存储保证堆顶是最长的单词。
贪心策略
每次从 groups 选择最长的符合条件的单词,以最大化单词链长度。
哈希表(字典 groups)
使用 dict 以 首字母 作为键,快速查找可连接单词
import sys
import heapqdef build_longest_chain(start_idx, words):"""构造最长的单词链:param start_idx: 起始单词索引:param words: 单词列表:return: 拼接后的最长单词链字符串"""result = [words[start_idx]] # 以索引 start_idx 的单词作为链的起点words[start_idx] = None # 标记该单词为已使用groups = {} # 以首字母为键,存储未使用的单词(按长度降序)# 构造 groups 字典:按首字母分类并存入最大堆for w in words:if w is not None: # 跳过已使用的单词if w[0] not in groups:groups[w[0]] = []heapq.heappush(groups[w[0]], (-len(w), w)) # 按长度降序存储# 逐步构造最长的单词链while True:last_char = result[-1][-1] # 取当前链的最后一个字符if last_char in groups and groups[last_char]: # 若存在以 last_char 开头的单词_, nxt = heapq.heappop(groups[last_char]) # 取出最长的单词result.append(nxt) # 添加到链中else:break # 无法继续延续单词链时终止return "".join(result) # 拼接单词返回最终结果def main():"""读取输入并调用构造函数"""data = sys.stdin.read().split() # 读取输入并按空格分割k = int(data[0]) # 读取起始索引n = int(data[1]) # 读取单词数量words = data[2:] # 读取单词列表print(build_longest_chain(k, words)) # 计算最长单词链并输出if __name__ == "__main__":main()
java解法
- 解题思路
- 解析输入
使用 Scanner 读取输入:
k:起始索引
n:单词总数
words[]:单词数组
构造最长单词链
初始化
result 存储最终的单词链,以索引 k 位置的单词作为起点。
words[startIdx] = null; 标记该单词已使用。
groups 是一个 Map<Character, PriorityQueue>,按首字母分类,PriorityQueue 以单词长度降序排序(相同长度按字典序)。
构造最长链
取 result 最后一个单词的末尾字符 lastChar,从 groups 取出最长的可连接单词 next 并加入 result。
若 groups.get(lastChar) 为空,则终止构造。
返回结果
将 result 列表拼接成字符串并返回。
使用到的算法
优先队列(PriorityQueue)
维护每个首字母对应的最长单词,保证每次取出的单词是最长的,若长度相同按字典序排列。
贪心策略
每次选择 最长的 符合条件的单词,以最大化单词链长度。
哈希表(Map<Character, PriorityQueue>)
Map 以首字母为键,快速查找可连接的单词队列。
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取起始索引和单词总数int k = sc.nextInt();int n = sc.nextInt();String[] words = new String[n];// 读取单词for (int i = 0; i < n; i++) words[i] = sc.next();// 计算并输出最长单词链System.out.println(buildLongestChain(k, words));}/*** 构造最长的单词链* @param startIdx 起始单词索引* @param words 输入的单词数组* @return 拼接后的最长单词链字符串*/public static String buildLongestChain(int startIdx, String[] words) {List<String> result = new ArrayList<>();result.add(words[startIdx]); // 以索引 startIdx 的单词作为链的起点words[startIdx] = null; // 标记该单词为已使用// 创建 Map,按首字母分类存储未使用的单词,并按长度降序排序(同长按字典序)Map<Character, PriorityQueue<String>> groups = new HashMap<>();for (String word : words) {if (word != null) { // 跳过已使用的单词char firstChar = word.charAt(0);groups.putIfAbsent(firstChar, new PriorityQueue<>((a, b) -> a.length() != b.length() ? b.length() - a.length() : a.compareTo(b)));groups.get(firstChar).offer(word); // 按长度降序加入队列}}// 逐步构造最长的单词链while (true) {String lastWord = result.get(result.size() - 1);char lastChar = lastWord.charAt(lastWord.length() - 1); // 取当前链的最后一个字符if (groups.containsKey(lastChar) && !groups.get(lastChar).isEmpty()) {result.add(groups.get(lastChar).poll()); // 取出最长的单词} else {break; // 无法继续延续单词链时终止}}return String.join("", result); // 拼接单词返回最终结果}
}
C++解法
- 解题思路
- 解析输入
读取 k(起始单词索引)和 n(单词总数)。
使用 getline(cin, words[i]) 逐行读取 n 个单词,存入 vector words。
构造最长单词链
初始化
以 words[k] 作为起始单词,存入 chain 。
从 words 中删除索引 k 处的单词,避免重复使用。
用 哈希表 prefix 按首字母分组,存储剩余单词。
对分组进行排序
对 prefix 的每个 vector 进行排序:
优先选择最长单词。
若长度相同,按字典序排序。
构造最长链
取 chain.back() 末尾字符 tail,在 prefix[tail] 找最长的单词,加入 chain。
若 prefix[tail] 为空,则终止构造。
返回结果
连接 chain 中所有单词,返回拼接后的字符串。
使用到的算法
哈希表(unordered_map<char, vector>)
以首字母为键,存储所有以该字母开头的单词列表,便于查找 可连接的最长单词。
贪心策略
优先选择最长的可连接单词,若长度相同,则按字典序排序。
排序(sort())
按单词长度降序排序,确保最长单词优先。
若长度相同,按字典序排序。
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>using namespace std;/*** 构造最长的单词链* @param words 输入的单词数组* @param k 起始单词索引* @return 拼接后的最长单词链字符串*/
string getResult(vector<string>& words, int k) {vector<string> chain;chain.push_back(words[k]); // 以索引 k 的单词作为链的起点words.erase(words.begin() + k); // 删除该单词,避免重复使用unordered_map<char, vector<string>> prefix; // 存储按首字母分组的单词// 组织 prefix 以首字母分类for (const string& word : words) {char w = word[0];prefix[w].push_back(word);}// 对每组单词排序:优先选择最长单词,若长度相同则按字典序排序for (auto& [key, wordsList] : prefix) {sort(wordsList.begin(), wordsList.end(), [](const string& a, const string& b) {if (a.length() != b.length()) {return a.length() > b.length(); // 长度降序}return a < b; // 字典序升序});}// 逐步构造最长的单词链while (true) {char tail = chain.back().back(); // 取当前链的最后一个字符if (prefix.count(tail) && !prefix[tail].empty()) {chain.push_back(prefix[tail].front()); // 取最长的单词prefix[tail].erase(prefix[tail].begin()); // 移除已使用的单词} else {break; // 无法继续延续单词链时终止}}// 拼接单词返回最终结果string result;for (const string& word : chain) {result += word;}return result;
}int main() {int k, n;cin >> k >> n;cin.ignore(); // 处理换行符vector<string> words(n);for (int i = 0; i < n; i++) {getline(cin, words[i]); // 读取单词}// 计算并输出最长单词链cout << getResult(words, k) << endl;return 0;
}
C解法
更新中
JS解法
使用 readline 监听 stdin(标准输入)。
lines.push(line) 存储输入行:
第一行 k(起始单词索引)。
第二行 n(单词总数)。
接下来的 n 行是单词。
构造最长单词链
初始化
words.splice(k, 1) 取出索引 k 处的单词作为起点,存入 chain 。
其余单词按首字母分组存入 prefix 对象(哈希表)。
对分组进行排序
优先选择最长单词(长度降序)。
若长度相同,按字典序排序。
构造最长链
取 chain 最后一个单词的末尾字符 tail,从 prefix[tail] 取最长单词 next 并加入 chain。
若 prefix[tail] 为空,则终止构造。
返回结果
将 chain 列表拼接成字符串并返回。
使用到的算法
哈希表(prefix 对象)
以首字母为键,存储所有以该字母开头的单词列表,便于查找 可连接的最长单词。
贪心策略
优先选择最长的可连接单词,若长度相同,则按字典序排序。
排序(Array.sort())
按单词长度降序排序,确保最长单词优先。
若长度相同,按字典序排序。
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");// 创建标准输入流监听
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
let k, n;// 读取输入行
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {// 解析 k(起始索引)和 n(单词总数)[k, n] = lines.map(Number);}if (n && lines.length === n + 2) {lines.shift(); // 移除第一行(k)lines.shift(); // 移除第二行(n)// 计算并输出最长单词链console.log(getResult(lines, k));lines.length = 0; // 清空输入}
});/*** 构造最长的单词链* @param {string[]} words 输入的单词数组* @param {number} k 起始单词索引* @return {string} 拼接后的最长单词链字符串*/
function getResult(words, k) {const chain = words.splice(k, 1); // 以索引 k 的单词作为链的起点const prefix = {}; // 存储按首字母分组的单词// 组织 prefix 以首字母分类for (let word of words) {const w = word[0];prefix[w] ? prefix[w].push(word) : (prefix[w] = [word]);}// 对每组单词排序:优先选择最长单词,若长度相同则按字典序排序for (let key in prefix) {prefix[key].sort((a, b) =>a.length !== b.length ? b.length - a.length : a > b ? 1 : -1);}// 逐步构造最长的单词链while (true) {let tail = chain.at(-1).at(-1); // 取当前链的最后一个字符if (prefix[tail] && prefix[tail].length > 0) {chain.push(prefix[tail].shift()); // 取最长的单词} else {break; // 无法继续延续单词链时终止}}return chain.join(""); // 拼接单词返回最终结果
}
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
相关文章:
【华为OD-E卷 - 单词接龙 100分(python、java、c++、js、c)】
【华为OD-E卷 - 单词接龙 100分(python、java、c、js、c)】 题目 单词接龙的规则是: 可用于接龙的单词首字母必须要前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相…...
美团Leaf分布式ID生成器使用教程:号段模式与Snowflake模式详解
引言 在分布式系统中,生成全局唯一ID是核心需求之一。美团开源的Leaf提供了两种分布式ID生成方案:号段模式(高可用、依赖数据库)和Snowflake模式(高性能、去中心化)。本文将手把手教你如何配置和使用这两种…...
性能测试过程实时监控分析
性能监控 前言一、查看性能测试结果的3大方式1、GUI界面报告插件2、命令行运行 html报告3、后端监听器接入仪表盘 二、influxDB grafana jmeter测试监控大屏1、原理:2、linux环境中influxDB 安装和配置3、jmerer后端监听器连接influxDB4、linux环境总grafana环境搭…...
【工具类】Java的 LocalDate 获取本月第一天和最后一天
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Eclipse 创建 Java 类
Eclipse 创建 Java 类 引言 Eclipse 是一款功能强大的集成开发环境(IDE),被广泛用于 Java 开发。本文将详细介绍如何在 Eclipse 中创建 Java 类,包括配置开发环境、创建新项目、添加类以及编写类代码等步骤。 配置 Eclipse 开发环境 1. 安装 Eclipse 首先,您需要在您…...
Centos编译升级libcurl
Centos编译升级libcurl 下载最新版源码包安装编译依赖配置编译选项如果报错:通过 EPEL 仓库安装手动源码编译安装 如果报错:安装Brotli 开发库 如果报错:方法一:安装 libpsl-devel 依赖通过 EPEL 仓库安装重新运行 configure 方…...
蓝桥杯第九天 2022 省赛 第 4 题 最少刷题数
太多坑了,考虑不全只能过50%,有两种特殊情况 public static void main(String[]args) {Scanner scan new Scanner(System.in);int n scan.nextInt();int a[] new int [100005];int b[] new int [100005];for(int i 0;i<n;i)a[i] scan.nextInt()…...
3D点云数据处理中的聚类算法总结
1.欧式聚类: 基于点的空间距离(欧几里得距离)来分割点云,将距离较近的点归为同一簇。 欧式聚类需要的参数:邻域半径R,簇的最小点阈值minPts,最大点数阈值maxPts。 实现效率: O(n * log n) 实现…...
配置本机监控
配置本机监控 1、安装zabbix-agent 2、编辑zabbix-agent配置文件 zabbix-agent工作模式: 主动模式 被动模式 这两行配置都是指定监控服务器的地址 被动模式下,zabbix server的地址 主动模式下,zabbix server的地址 指定被监控端的名称&…...
基于python的Flask模块化设计与蓝图的妙用——打造轻量化Web应用
基于python的Flask模块化设计与蓝图的妙用——打造轻量化Web应用 前言 如果你刚开始学习Flask,可能会遇到这样的困惑:当项目功能越来越多,代码都堆在一个.py文件里,不仅难维护,还容易冲突。别担心!本文将用…...
历年云南大学计算机复试上机真题
历年云南大学计算机复试机试真题 在线评测:传送门:pgcode.cn 喝饮料 题目描述 商店里有 n 中饮料,第 i 种饮料有 mi 毫升,价格为 wi。 小明现在手里有 x 元,他想吃尽量多的饮料,于是向你寻求帮助&#x…...
Python 线程池
Python 线程池 flyfish 线程池的概念 线程池是一种多线程处理形式,它预先创建了一定数量的线程,这些线程会被保存在一个线程池中。当有新的任务提交时,线程池会从池中取出一个空闲的线程来执行该任务;若池中没有空闲线程&#…...
【Linux】Bash是什么?怎么使用?
李升伟 整理 什么是 Bash? Bash(Bourne Again Shell)是一种 命令行解释器(Shell),广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell(sh) 的增强版,提供了更多的功能…...
蓝桥杯day2:解码异或 后的数组
一、题意 未知 整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] arr[i] XOR arr[i 1] 。例如,arr [1,0,2,1] 经编码后得到 encoded [1,2,3] 。 给你编码后的数组 encoded 和原数组 arr …...
R语言软件配置(自用)
①输入R: The R Project for Statistical Computing ②点击进入Cran镜像网页,选择清华大学镜像,选择自己合适的版本下载即可(以我电脑windows为例)。 ③点击base或者install R for the first time,然后选择Download R-4.4.3 for windows&…...
基于deepseek的智能语音客服【第二讲】后端异步接口调用封装
本篇内容主要讲前端请求(不包含)访问后端服务接口,接口通过检索知识库,封装提示词,调用deepseek的,并返回给前端的全过程,非完整代码,不可直接运行。 1.基于servlet封装异步请求 为…...
LEDNet总结
LEDNet:联合低光增强和暗光去模糊 1、暗光增强和去模糊可以单独处理,但是合并效果不理想。 研究问题的背景:光线不足 可见度颜色失真 最小快门速度有限 长时间曝光引起运动模糊 低光运动模糊同时存在 存在问题:暗光增强后运动模…...
线性规划的标准形式
标准形式的定义 目标函数:最大化线性目标函数 其中,x 是决策变量向量,c 是目标系数向量。 约束条件:等式形式约束 A x b, 其中,A 是约束系数矩阵,b 是常数项向量。 变量非负约束: 。 因此…...
xxl-job 执行器端服务器的简单搭建
xxl-job 执行器端服务器的简单搭建 先讲一下我们平时怎么使用 xxl-job 的,再引出背后是如何实现的。 我觉得对于一款成功的框架来说,好用,是非常重要的一个特性。 框架要便于接入,便于使用。对于用户来说,不要有太多…...
数字化企业可能会用到的系统有哪些?
你是否也曾像我一样,对这些问题充满疑问: 在企业数字化转型的浪潮中,究竟会涉及哪些系统? 这些系统又分别在何种情境下被投入使用? 如果你也有这样的疑问,那么这篇文章或许能为你答疑解惑。 为了给你一…...
【Linux】:守护进程化
朋友们、伙计们,我们又见面了,本期来给大家带来守护进程相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…...
在 web 部署 YOLOv8目标检测(Django+html)
本文介绍如何将自己训练好的模型在网页上进行应用,使用 Django html 进行部署,能够对视频和图像进行识别,并显示到页面上,下面是一个效果: 上 传 和另外 7 个页面 - 个人 - Microsoft Edge 2025-03-13 21-52-06 下面进…...
程序员学商务英语之Making Business Calls
Dialogue-1 Reaching Somebody By Telephone电话找人 A: What do you think the secrect to success is? 你认为成功的秘诀是什么? B: Hold on to your dreams. 坚持你的梦想。 A: May I speak to your boss, Mr. Wong? 请你的老板,王先生接电话?…...
java项目之基于ssm的少儿编程在线培训系统(源码+文档)
项目简介 少儿编程在线培训系统实现了以下功能: 用户信息管理: 用户信息新增 用户信息修改 教师信息管理: 教师信息添加 教师信息删除 教师信息修改 课程信息管理: 课程信息添加 课程信息修改 课程信息删除 课程类型管理&…...
【初学者】Python语言中有没有指针类型?
李升伟 整理 在Python语言中,没有像C或C那样的显式指针类型。Python的设计哲学强调简洁和易读,因此它隐藏了许多底层的细节,包括指针。 不过,Python中的变量可以被视为对对象的引用。当你创建一个对象并将其赋值给一个变量时&am…...
RG-S3760应用协议配置
RG-S3760应用协议配置 1. dhcp 服务配置 提问:如何在设备上开启dhcp 服务,让不同VLAN 下的电脑获得相应的IP 地址? 回答: 步骤一:配置VLAN 网关IP 地址,及将相关端口划入相应的VLAN 中 S3760#con t S…...
C++基础 [八] - list的使用与模拟实现
目录 list的介绍 List的迭代器失效问题 List中sort的效率测试 list 容器的模拟实现思想 模块分析 作用分析 list_node类设计 list 的迭代器类设计 迭代器类--存在的意义 迭代器类--模拟实现 模板参数 和 成员变量 构造函数 * 运算符的重载 运算符的重载 -- 运…...
skywalking微服务链路追踪
是什么? skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点…...
K8S学习之基础三十七:prometheus监控node资源
Prometheus v2.2.1 编写yaml文件,包含创建ns、configmap、deployment、service # 创建monitoring空间 vi prometheus-ns.yaml apiVersion: v1 kind: Namespace metadata:name: monitor-sa# 创建SA并绑定权限 kubectl create serviceaccount monitor -n monito…...
Web 小项目: 网页版图书管理系统
目录 最终效果展示 代码 Gitee 地址 1. 引言 2. 留言板 [热身小练习] 2.1 准备工作 - 配置相关 2.2 创建留言表 2.3 创建 Java 类 2.4 定义 Mapper 接口 2.5 controller 2.6 service 3. 图书管理系统 3.1 准备工作 - 配置相关 3.2 创建数据库表 3.2.1 创建用户表…...
1221. 四平方和 -蓝桥杯真题-哈希函数思想
原题链接:1221. 四平方和 - AcWing题库 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 44 个正整数的平方和。 如果把 00 包括进去,就正好可以表示为 44 个数的平方和。 比如: 对于一个给定的正整…...
为什么要学习人工智能(AI)?—— 未来已来,AI引领时代变革
未来已来,AI引领时代变革 在这个日新月异的时代,人工智能(AI)正以不可阻挡之势重塑着我们的世界。从教育的深耕细作到科研的突破创新,从行政的效率提升到管理的智慧化转型,AI技术如同一股强大的潮流&#x…...
Markdig:强大的 .NET Markdown 解析器详解
在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器…...
云计算迁移革命:企业如何摆脱“单一云”锁定,构建自主云未来?
一场价值690亿美元的行业地震 2023年,博通(Broadcom)以690亿美元完成对VMware的收购,这不仅是企业IT历史上的一次天价并购,更在全球云计算市场掀起了一场深远的地震。VMware长期以来是企业数据中心的核心支柱…...
蓝桥杯篇---按键长按与双击
文章目录 前言1. 新增全局变量和宏定义解释1.1宏定义KEY_EVENT_*DEBOUNCE_TIMEHOLD_TIMEDOUBLE_TIMEMULTI_TIME 1.2全局变量Key_ValKey_OldKey_DownKey_Upsys_tickkey_eventkey_pressedkey_press_startkey_last_releaseclick_cnt 2. 定时器初始化(1ms中断࿰…...
created在vue3 script setup中的写法
在 Vue 2 里,created 是一个生命周期钩子函数,会在实例已经创建完成之后被调用,主要用于在实例初始化之后、数据观测和 event/watcher 事件配置之前执行代码。而在 Vue 3 的 <script setup> 语法糖里,不再有像 Vue 2 那样直…...
基于springboot的房屋租赁系统(008)
摘 要 社会的发展和科学技术的进步,互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。互联网具有便利性,速度快,效率高,成本低等优点。 因此,构建符…...
Linux上的`i2c-tools`工具集的编译构建和安装
源码复制到Ubuntu系统中并解压 的i2c-tools工具集的源码百度网盘下载链接: https://pan.baidu.com/s/1XNuMuT1auT1dMzYo3LAFmw?pwdi6xe 终端进入源码目录 cd /home/book/mybuild/i2c-tools-4.2执行编译构建命令 运行下面的命令进行编译构建 make CC${CROSS_COM…...
java项目之基于ssm的社区流浪动物救助领养系统
项目简介 社区流浪动物救助领养系统实现了以下功能: 本社区流浪动物救助领养系统分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理回访信息以及回访的租赁信息,能够与用户进行相互交流等操作,…...
网络空间安全(34)安全防御体系
前言 安全防御体系是一个多层次、多维度的系统,旨在保护组织或个人的信息资产免受各种网络攻击和威胁。 一、技术层面 网络边界防御 防火墙:部署在网络边界,通过设定规则允许或阻止特定流量的进出,保护内部网络不受外部攻击。入侵…...
《Linux 网络架构:基于 TCP 协议的多人聊天系统搭建详解》
一、系统概述 本系统是一个基于 TCP 协议的多人聊天系统,由一个服务器和多个客户端组成。客户端可以连接到服务器,向服务器发送消息,服务器接收到消息后将其转发给其他客户端,实现多人之间的实时聊天。系统使用 C 语言编写&#x…...
知识蒸馏:让大模型“瘦身”的魔法
知识蒸馏:让大模型“瘦身”的魔法 什么是蒸馏模型?AI界的“知识浓缩术”核心定义传统训练 vs 知识蒸馏关键优势 DeepSeek的蒸馏“三步魔法”骨架提取——搭建“迷你版大脑”知识灌注——模仿教师的“思考过程”微调优化——针对场景“查漏补缺” DeepSee…...
MySQL数据库精研之旅第一期:开启数据管理新旅程
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、数据库简介 1.1. 数据库的概念 1.2. 数据库和数据结构的关系 1.3. 主流数据库 1.3.1. 关系型数据库 1.3.2. 非关系型数据库 1.4. 关系型数据库的概念 二、MySQL配置 2.1. mysqld服务端程序 …...
Linux复习——基础IO,认识文件描述符、软硬件链接
1.复习C文件接口 1.1 fopen FILE *fopen(const char *path, const char *mode); path:带路径的文件名称(待打开的文件) mode: r:以可读方式打开,不可写,文件不存在,则报错 r&…...
【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计
欢迎来到Java集合框架系列的第一篇文章!🌹 本系列文章将以通俗易懂的语言,结合实际开发经验,带您深入理解Java集合框架的设计智慧。🌹 若文章中有任何不准确或需要改进的地方,欢迎大家指出,让我…...
Prometheus使用
介绍:Prometheus 是一个开源的 监控与告警系统,主要用于采集和存储时间序列数据(Time Series Data) Prometheus的自定义查询语言PromQL Metric类型 为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheu…...
Java学习打卡-Day19-Set、HashSet、LinkedHashSet
Set 接口 无序(添加和取出顺序不一致)(但取出顺序固定)。没有索引。不允许重复,所以最多一个null。遍历方式 迭代器增强for循环不能使用普通for循环索引方式。 HashSet 实现了Set接口,具有相应特征。底…...
冯・诺依曼架构深度解析
一、历史溯源:计算机科学的革命性突破 1.1 前冯・诺依曼时代 在 1940 年代之前,计算机领域呈现 "百家争鸣" 的格局: 哈佛 Mark I(1944):采用分离的指令存储与数据存储ENIAC(1946&a…...
单片机学完开发板,如何继续提升自己的技能?
很多人学完开发板后都会卡在一个尴尬的阶段:觉得自己会的东西不少,但又不知道下一步该干啥。会点C语言,能烧录程序,能点亮LED,玩转按键,搞定串口等等,能用开发板做点小玩意儿,但面对…...
Nginx 日志格式
默认日志格式配置 log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for";该格式记录了客户端IP、用户、时间、请求、状态…...