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

【LeetCode Solutions】LeetCode 146 ~ 150 题解

CONTENTS

  • LeetCode 146. LRU 缓存(中等)
  • LeetCode 147. 对链表进行插入排序(中等)
  • LeetCode 148. 排序链表(中等)
  • LeetCode 149. 直线上最多的点数(困难)
  • LeetCode 150. 逆波兰表达式求值(中等)

LeetCode 146. LRU 缓存(中等)

【题目描述】

请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity)正整数作为容量 capacity 初始化 LRU 缓存;
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value;如果不存在,则向缓存中插入该组 key-value。如果插入操作导致关键字数量超过 capacity,则应该逐出最久未使用的关键字。

函数 getput 必须以 O ( 1 ) O(1) O(1) 的平均时间复杂度运行。

【示例 1】

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

【提示】

1 < = c a p a c i t y < = 3000 1 <= capacity <= 3000 1<=capacity<=3000
0 < = k e y < = 10000 0 <= key <= 10000 0<=key<=10000
0 < = v a l u e < = 1 0 5 0 <= value <= 10^5 0<=value<=105
最多调用 2 ∗ 1 0 5 2 * 10^5 2105getput


【分析】

使用哈希表可以实现时间复杂度为 O ( 1 ) O(1) O(1) 的增删改查,但是还需要实现 LRU 的机制,我们要能够修改每个键值对的时间戳,同时还能够快速找到时间戳最小的键值对。

可以用一个双链表维护这个时间戳,时间戳最新的节点在头部,最旧的节点在尾部,哈希表用于从 key 映射到对应的节点,这样查找双链表的节点就是 O ( 1 ) O(1) O(1) 的,从而双链表的插入与删除操作也是 O ( 1 ) O(1) O(1) 的。


【代码】

class LRUCache {
private:struct Node {int key, val;Node *left, *right;Node(int key, int val): key(key), val(val), left(nullptr), right(nullptr) {}}*L, *R;int n;unordered_map<int, Node*> hash;void insert(Node* p) {  // 将 p 插入到链表的首部p->left = L, p->right = L->right;L->right->left = p, L->right = p;}void remove(Node* p) {  // 将 p 从链表中删除p->left->right = p->right;p->right->left = p->left;}public:LRUCache(int capacity) {n = capacity;L = new Node(-1, -1), R = new Node(-1, -1);L->right = R, R->left = L;}int get(int key) {if (!hash.count(key)) return -1;Node* p = hash[key];remove(p);insert(p);return p->val;}void put(int key, int value) {if (!hash.count(key)) {if (hash.size() == n)  // 容量满了则删除链表的最后一个点hash.erase(R->left->key), remove(R->left);hash[key] = new Node(key, value);insert(hash[key]);} else {Node* p = hash[key];p->val = value;remove(p);insert(p);}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

LeetCode 147. 对链表进行插入排序(中等)

【题目描述】

给定单个链表的头 head,使用插入排序对链表进行排序,并返回排序后链表的头

插入排序算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  3. 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

在这里插入图片描述

【示例 1】

在这里插入图片描述

输入: head = [4,2,1,3]
输出: [1,2,3,4]

【示例 2】

在这里插入图片描述

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

【提示】

列表中的节点数在 [ 1 , 5000 ] [1, 5000] [1,5000] 范围内
− 5000 < = N o d e . v a l < = 5000 -5000 <= Node.val <= 5000 5000<=Node.val<=5000


【分析】

对于当前要插入的点,我们要在已排序区间中找到第一个大于当前点的位置,将当前点插入到这个更大的点的前面。如果当前点前面的点都小于等于自身,则直接插入在区间末尾即可。


【代码】

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* insertionSortList(ListNode* head) {ListNode* dummy = new ListNode(-1, head);ListNode* p = head->next;head->next = nullptr;  // 刚开始已排序区间只有头节点,先将其 next 置为空标记排序区间的末尾while (p) {ListNode* cur = dummy;while (cur->next && cur->next->val <= p->val) cur = cur->next;ListNode* q = p->next;if (!cur->next)  // p 比已排序节点都更大则接在已排序区间的末尾p->next = nullptr, cur->next = p;else  // 否则 cur->next 是第一个大于 p 的节点,将 p 插入到 cur 后面p->next = cur->next, cur->next = p;p = q;}return dummy->next;}
};

LeetCode 148. 排序链表(中等)

【题目描述】

给你链表的头结点 head,请将其按升序排列并返回排序后的链表

【示例 1】

在这里插入图片描述

输入:head = [4,2,1,3]
输出:[1,2,3,4]

【示例 2】

在这里插入图片描述

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

【示例 3】

输入:head = []
输出:[]

【提示】

链表中节点的数目在范围 [ 0 , 5 ∗ 1 0 4 ] [0, 5 * 10^4] [0,5104]
− 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^5 105<=Node.val<=105

进阶:你可以在 O ( n l o g n ) O(n log n) O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?


【分析】

由于快排和递归的归并排序都需要递归,空间复杂度为 O ( l o g n ) O(log n) O(logn),只有迭代的归并排序可以实现 O ( 1 ) O(1) O(1) 的空间复杂度。

用迭代实现归并排序其实就是自底向上做,即刚开始的时候每个节点自身就是一个独立的区间。

第一次迭代的时候将每个长度为 1 的区间两两进行合并,成为一个长度为 2 的有序区间,然后下一轮就将每个长度为 2 的区间合并成长度为 4 的区间,以此类推。

本题的代码实现比较复杂,不太理解可以画个图模拟一下。


【代码】

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {int n = 0;  // 链表长度for (ListNode* p = head; p; p = p->next) n++;for (int i = 1; i < n; i *= 2) {  // 枚举要合并的每一段长度ListNode *dummy = new ListNode(-1),*cur = dummy;  // dummy->next 是合并后上一层的头节点for (int j = 0; j < n; j += i * 2) {  // 需要合并的次数为 (n + 1) / i * 2ListNode *p = head, *q = head;for (int k = 0; k < i && q; k++) q = q->next;  // q 向后跳 i 次到另一段的头部int l = 0, r = 0;  // 左右两段已合并的节点数while (l < i && r < i && p && q) {  // 只要两段都不为空且还有节点没合并则进行对比合并if (p->val <= q->val) cur = cur->next = p, p = p->next, l++;else cur = cur->next = q, q = q->next, r++;}while (l < i && p) cur = cur->next = p, p = p->next, l++;  // 合并左段剩余的节点while (r < i && q) cur = cur->next = q, q = q->next, r++;  // 合并右段剩余的节点if (q) head = q;  // head 移动到后面两段区间的头部}cur->next = nullptr;  // 合并完成后将末尾节点的 next 置为空head = dummy->next;}return head;}
};

LeetCode 149. 直线上最多的点数(困难)

【题目描述】

给你一个数组 p o i n t s points points,其中 p o i n t s [ i ] = [ x i , y i ] points[i] = [x_i, y_i] points[i]=[xi,yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

【示例 1】

在这里插入图片描述

输入:points = [[1,1],[2,2],[3,3]]
输出:3

【示例 2】

在这里插入图片描述

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

【提示】

1 < = p o i n t s . l e n g t h < = 300 1 <= points.length <= 300 1<=points.length<=300
p o i n t s [ i ] . l e n g t h = = 2 points[i].length == 2 points[i].length==2
− 1 0 4 < = x i , y i < = 1 0 4 -10^4 <= x_i, y_i <= 10^4 104<=xi,yi<=104
points 中的所有点互不相同


【分析】

任意两点确定一条直线,我们可以先枚举每条直线,如果暴力枚举时间是 O ( n 2 ) O(n^2) O(n2),然后再判断有多少个点在这条直线上,时间为 O ( n ) O(n) O(n),因此总共的时间复杂度为 O ( n 3 ) O(n^3) O(n3)

也可以枚举每个点,然后判断其他点到这个点的斜率是多少,也就是确定其他点与这个点所形成的直线,然后判断哪条直线上的点最多。由于垂直线没有斜率,因此可以用一个变量单独记一下。本题保证每个点不同,如果可能存在重复点那么还需要开个变量记录下相同点的数量,无论是哪条直线都要算上当前枚举点的重复点数量。


【代码】

class Solution {
public:int maxPoints(vector<vector<int>>& points) {int res = 0;for (auto a: points) {unordered_map<long double, int> cnt;  // long double 防止精度被卡int vc = 0;  // 与 a 在一条垂线上的点数for (auto b: points) {if (b == a) continue;if (b[0] == a[0]) vc++;else {long double k = (long double) (b[1] - a[1]) / (b[0] - a[0]);  // 记得要强制转换cnt[k]++;}}for (const auto &[k, v]: cnt) res = max(res, v + 1);res = max(res, vc + 1);}return res;}
};

LeetCode 150. 逆波兰表达式求值(中等)

【题目描述】

给你一个字符串数组 tokens,表示一个根据逆波兰表示法表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

【示例 1】

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

【示例 2】

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

【示例 3】

输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

【提示】

1 < = t o k e n s . l e n g t h < = 1 0 4 1 <= tokens.length <= 10^4 1<=tokens.length<=104
tokens[i] 是一个算符("+""-""*""/"),或是在范围 [ − 200 , 200 ] [-200, 200] [200,200] 内的一个整数

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

【分析】

很经典的逆波兰表达式求值,提示中已经说明了做法,就是遇到数字就直接入栈,遇到运算符就出栈两个元素进行运算后将结果入栈,只要注意后出栈的那个才是被运算数,例如按顺序出栈 x x x y y y,当前操作符为 /,那么运算结果为 y / x y / x y/x


【代码】

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> stk;for (string s: tokens) {if (s != "+" && s != "-" && s != "*" && s != "/") stk.push(stoi(s));else {int x = stk.top(); stk.pop();int y = stk.top(); stk.pop();if (s == "+") stk.push(y + x);else if (s == "-") stk.push(y - x);else if (s == "*") stk.push(y * x);else stk.push(y / x);}}return stk.top();}
};

相关文章:

【LeetCode Solutions】LeetCode 146 ~ 150 题解

CONTENTS LeetCode 146. LRU 缓存&#xff08;中等&#xff09;LeetCode 147. 对链表进行插入排序&#xff08;中等&#xff09;LeetCode 148. 排序链表&#xff08;中等&#xff09;LeetCode 149. 直线上最多的点数&#xff08;困难&#xff09;LeetCode 150. 逆波兰表达式求值…...

《 如何更高效地学习》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;个人谈心 &#x1f30d;文章目入 一、明确学习目标二、制定学习计划三、选择合适的学习方法&#xff08;一&#xff09;主动学习&#xff08;二&#xff09;分散学习&#xff08;三&#…...

常用中间件合集

简介 在游戏或者web服务器开发过程中 难免会使用一些中间件 正所谓有现成的 就没必要重复造轮子了 以下大概介绍下常用的中间件nginx etcd nats docker k8s nginx 简介 Nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万…...

分布式数据一致性场景与方案处理分析|得物技术

一、引言 在经典的CAP理论中一致性是指分布式或多副本系统中数据在任一时刻均保持逻辑与物理状态的统一&#xff0c;这是确保业务逻辑正确性和系统可靠性的核心要素。在单体应用单一数据库中可以直接通过本地事务(ACID)保证数据的强一致性。 然而随着微服务架构的普及和业务场…...

JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南

1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库&#xff0c;它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API&#xff0c;封装了很多复杂的 ZooKeeper 操作&#xff0c;例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…...

C++ - 宏基础(简单常量替换宏、函数样式的宏、多行宏、预定义宏、字符串化宏、连接宏、可变参数日志宏)

宏概述 在编程中&#xff0c;宏&#xff08;Macro&#xff09;是一种预处理器指令 宏可以让程序员在源代码中定义一段值或代码的别名&#xff0c;在编译程序之前&#xff0c;预处理器会查找这些宏&#xff0c;并将其替换为相应的值或代码 C 宏 在 C 中&#xff0c;宏可以通过…...

Linux中的调试器gdb与冯·诺伊曼体系

一、Linux中的调试器&#xff1a;gdb 1.1安装与版本查看 可以使用yum进行安装&#xff1a; yum install -y gdb 版本查看&#xff1a;使用指令 gdb --version 1.2调试的先决条件&#xff1a;release版本与debug版本的切换 debug版本&#xff1a;含有调试信息 release版本…...

STM32 + keil5 跑马灯

硬件清单 1. STM32F407VET6 2. STLINK V2下载器(带线) 环境配置 1. 安装ST-LINK 2. 安装并配置 keil5 https://blog.csdn.net/qq_36535414/article/details/108947292 https://blog.csdn.net/weixin_43732386/article/details/117375266 3. 接线并下载 点击"LOAD“&a…...

Ruby语言的代码重构

Ruby语言的代码重构&#xff1a;探索清晰、可维护与高效的代码 引言 在软件开发的过程中&#xff0c;代码的质量直接影响到项目的可维护性、扩展性和整体性能。随着时间的推移&#xff0c;系统的需求变化&#xff0c;代码可能会变得混乱和难以理解&#xff0c;因此&#xff0…...

leetcode 数组总结篇

基础理论 数组&#xff1a;下标时从 0 开始的&#xff0c;地址是连续的&#xff0c;不能删除&#xff0c;只能覆盖&#xff1b;数组的实现&#xff1a;vector动态数组 常用操作 头文件 #include <iostream> #include <vector> #include <cstdint> // IN…...

盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验

在数字化浪潮席卷消费市场的今天&#xff0c;盲盒小程序以其独特的趣味性和互动性&#xff0c;迅速成为了年轻人追捧的娱乐消费新宠。盲盒小程序不仅为用户带来了拆盒的惊喜和刺激&#xff0c;更为商家提供了创新的营销手段。为了满足市场对盲盒小程序日益增长的需求&#xff0…...

DuckDB系列教程:如何分析Parquet文件

Parquet 是一种强大的、基于列的存储格式&#xff0c;适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。 在这篇文章中&#xff0c;我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单…...

深入解析:使用Python爬取Bilibili视频

深入解析&#xff1a;使用Python爬取Bilibili视频 引言 Bilibili&#xff0c;作为中国领先的年轻人文化社区&#xff0c;拥有海量的视频资源。对于想要下载Bilibili视频的用户来说&#xff0c;手动下载不仅费时费力&#xff0c;而且效率低下。本文将介绍如何使用Python编写一…...

GRE,MGRE

GRE&#xff1a;静态过程&#xff0c;有局限性 R1 &#xff1a; [r1]interface Tunnel 0/0/0 --- 创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 给隧道接口分配一个 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定义接口的封装方式 [r1-Tun…...

【linux学习】linux系统调用编程

目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…...

Azure Speech 赋能,为智能硬件注入 AI 语音 “新灵魂”

在人工智能技术飞速发展的今天&#xff0c;智能硬件正逐步渗透到人们生活的方方面面。AI玩具、AI眼镜、AI鼠标等创新产品不仅提升了用户体验&#xff0c;更带来了前所未有的交互方式。领驭科技凭借微软Azure Speech的强大技术能力&#xff0c;为硬件厂商提供一站式AI语音解决方…...

力扣DAY35 | 热100 | LRU缓存

前言 中等 ⚪ 这个题原本打算用双链表最小堆做&#xff0c;发现无解。没想到双向链表。 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int …...

Python 助力人工智能与机器学习的深度融合

技术革新的 “源动力” 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;与机器学习&#xff08;ML&#xff09;无疑是最具影响力的技术领域&#xff0c;它们如同强大的引擎&#xff0c;推动着各个行业的变革与发展。Python 凭借其简洁易读的语法、丰富的库和…...

ARXML文件解析-1

目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 ARXML文件的结构树2.3 TAG&#xff08;XML元素&#xff09;2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 XML声明与根元素4.4.3.1 xmlns&#xff08;默认命名空间&#xff09;4.4.3.2 xmlns:xsi&…...

SignalR给特定User发送消息

1、背景 官网上SignalR的demo很详细&#xff0c;但是有个特别的问题&#xff0c;就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个&#xff1a; 1、最简单的方案&#xff0c;客户端连接SignalR的Hub时&#xff0c;只是简单的连接&#xff0c…...

React: hook相当于函数吗?

一、Hook 是一个函数&#xff0c;但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数&#xff0c;例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数&#xff08;如初始状态值或依赖项数组&#xff09;&#xff0c;并返回结果&#xff08;如状态值和…...

Ubuntu 安装 VLC

最近项目中需要用VLC查看NVR下子设备的RTSP流&#xff0c;特此记录&#xff0c;便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…...

【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)

湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化&#xff0c;还与人类活动、气候波动及地质过程密切相关。因此&#xff0c;高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...

UBUNTU编译datalink

参考文档 datalink 语雀 下载 git clone https://gitee.com/liyang9512/datalink 源码打包 mvn -Prelease-datalink -Dmaven.test.skiptrue clean install -U 启动准备 # unzip ./distribution/target/datalink-server-1.0.0.tar.gz tar -xvf ./distribution/target/da…...

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先&#xff0c;我们详细介绍了SSM框架&#xff0c;这是一种经典的Java Web开发框架&#xff0c;由Spring、SpringMVC和MyBatis三个开源项目整合而成&#xff0c;为开发企业级应用提供了高效、灵活、…...

STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.04 STM32开发板学习——第14节: [6-2] 定时器定时中断&定时器外部时钟 前言开发…...

2025-04-03 Latex学习1——本地配置Latex + VScode环境

文章目录 1 安装 Latex2 安装 VScode3 配置环境3.1 汉化 VScode3.2 安装 latex 插件3.3 配置解释 4 编译示例5 加快你的编译5.1 取消压缩5.2 使用 PDF 代替图片 6 参考文章 1 安装 Latex 本文配置环境&#xff1a; Windows11 打开清华大学开源软件镜像站&#xff1a;https://mi…...

【CF】Day24——Codeforces Round 994 (Div. 2) D

D. Shift Esc 题目&#xff1a; 思路&#xff1a; 典DP的变种 如果这一题没有这个变换操作&#xff0c;那么是一个很典型的二维dp&#xff0c;每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换&#xff0c;那我们就要考虑变换操作&#xff0c;首先一个显然…...

【Java集合】LinkedList源码深度分析

参考笔记&#xff1a;java LinkedList 源码分析&#xff08;通俗易懂)_linkedlist源码分析-CSDN博客 目录 1.前言 2.LinkedList简介 3.LinkedList的底层实现 4.LinkedList 与 ArrayList 的对比 4.1 如何选择 4.2 对比图 5.LinkedList 源码Debug 5.1 add(E e) &#xff…...

第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组

题目1 回文数组 小蓝在无聊时随机生成了一个长度为 n 的整数数组&#xff0c;数组中的第 i 个数为 ai&#xff0c;他觉得随机生成的数组不太美观&#xff0c;想把它变成回文数组&#xff0c;也是就对于任意 i∈[1,n] 满足 a i a n − i 1 a_ia_{n−i}1 ai​an−i​1。 小蓝…...