6. 顺序表和链表*****
目录
1. 顺序表
1.1 原理
1.2 常见的增删查改
1.3 顺序表的问题
2. 链表
2.1 原理
2.2 无头单向非循环的增删查改
2.3 链表面试题
1. 删除链表中等于给定值val的所有节点203. 移除链表元素
2. 链表逆置206. 反转链表(考的最多)
3.给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。876. 链表的中间结点
4.实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。面试题 02.02. 返回倒数第 k 个节点
5. 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 21. 合并两个有序链表
6.给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。面试题 02.04. 分割链表
7. 链表的回文结构234. 回文链表
8.给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点LCR 023. 相交链表。
9.给你一个链表的头节点 head ,判断链表中是否有环。141. 环形链表
10.给定一个链表的头节点 head ,返回链表开始入环的第一个节点。142. 环形链表 II
11. 链表深度拷贝138. 随机链表的复制
1. 顺序表
1.1 原理
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般分为:
1.静态顺序表:使用定长数组存储元素
2.动态顺序表:使用动态开辟的数组存储
1.2 常见的增删查改
typedef int SLDateType;typedef struct SeqList
{SLDataType* a;size_t size;size_t capacity;
}SeqList;// 对数据的管理:增删查改
void SeqListDestroy(SeqList* ps)
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}void SeqListCheck(SeqList *ps)
{if(ps->size == ps->capacity){SLDateType *tmp = (SLDateType*)realloc(ps->a,sizeof(SLDateType)*ps->capacity*2);if(tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}void SeqListPushBack(SeqList* ps, SLDateType x)
{SeqListCheck(ps);ps->a[ps->size++] = x;
}void SeqListPushFront(SeqList* ps, SLDateType x)
{assert(ps);SeqListCheck(ps);int end = ps->size-1;while(end >= 0){ps->a[end+1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size>0);int begin = 0;while(begin<ps->size){ps->a[begin] = ps->a[begin+1];begin++;}ps->size--;
}
void SeqListPopBack(SeqList* ps)
{assert(ps->size>0);ps->size--;
}// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x)
{assert(ps);int i = 0;for(i=0; i<ps->size; i++){if(ps->a[i]==x){return i;}}return -1;
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <=ps->size);SeqListCheck(ps);int end = ps->size-1;while(end >=pos){ps->a[end+1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);assert(pos >=0 && pos <= ps->size);int begin = pos+1;while(begin<ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
}
顺序表的所有操作都是基于数组下标完成的,不需要修改数组的起始地址,因此不需要使用二级指针。
1.3 顺序表的问题
1. 中间、头部的插入删除,时间复杂度为O(N)
2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗
3.增容一般呈2倍的增长,肯定会有空间的浪费,比如当前容量是100, 满了以后增容到200,我们再插入2个数据,那么就浪费了98个数据空间。
链表解决了以上问题。
2. 链表
2.1 原理
链表是一种物理存储上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表与顺序表相辅相成。
链表的种类有很多种:
带头/不带头,单向/双向,循环/非循环,互相组合共有8种。我们常用就两种:无头单向非循环、带头双向循环链表(尾→next指向哨兵位的头,哨兵位的prev指向尾)。
1.无头单向非循环:结构简单,一般不会用来单独存数据,实际更多是作为其他数据结构的子结构,如哈希桶等。另外这种结构在笔试面试中出现很多。
2.带头双向循环链表:结构最复杂,一般用于单独存储数据,实际中使用的链表都是带头双向循环链表。
2.2 无头单向非循环的增删查改
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>typedef int SLTDateType;typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;// 动态申请一个节点
SListNode *BuySListNode(SLTDateType x)
{SListNode *newnode = (SListNode*)malloc(sizeof(SListNode));if(newnode == NULL){perror("malloc fail:");return NULL;}newnode->data = x;newnode->next = NULL;return newnode;
}
// 单链表打印
void SListPrint(SListNode* plist)
{SListNode *cur = plist;while(cur!=NULL){printf("%d->",cur->data);cur = cur->next;}printf("NULL");
}
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{SListNode *newnode = BuySListNode(x);if(*pplist == NULL){*pplist = newnode;//解引用二级指针来修改指针本身。}else{SListNode *tail = *pplist;while(tail->next != NULL){tail = tail->next;}tail->next = newnode;}
}// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{SListNode *newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;
}
// 单链表的尾删
void SListPopBack(SListNode** pplist)
{assert(pplist);//如果 pplist 为 NULL,说明调用者传入了一个无效的指针,后续对 *pplist 的解引用会导致程序崩溃(解引用空指针是未定义行为)。assert(*pplist);//检查链表是否为空if((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}else{SListNode *prev = NULL;SListNode *tail = *pplist;while(tail->next !=NULL){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;}
}
// 单链表头删
void SListPopFront(SListNode** pplist)
{assert(pplist);SListNode *first = *pplist;*pplist = first->next;free(first);first = NULL;
}
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{SListNode *cur = plist;while(cur != NULL){if(cur->data == x){return cur;}else{cur = cur->next;}}return NULL;
}// 分析思考为什么不在pos位置之前插入?
// 答:需要pos前的next指向插入的newnode,但pos前一个位置只能从头才能找到。
// 单链表在pos位置之后插入x。
void SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);SListNode *newnode = BuySListNode(x);newnode->next = pos->next;pos->next = newnode;
}// 分析思考为什么不删除pos位置?答:同理需要找到pos前一个位置
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{assert(pos);assert(pos->next);SListNode *del = pos->next;pos->next = del->next;free(del);del = NULL;
}// 在pos的前面插入
void SLTInsert(SListNode** pphead, SListNode* pos, SLTDateType x)
{assert(pos);assert(*pphead);if(pos == *pphead){SListPushFront(pphead, x);}else{SListNode *prev = *pphead;while (prev->next != pos){prev = prev->next;}SListNode *newnode = BuySListNode(x);prev->next = newnode;newnode->next = pos;}
}
// 删除pos位置
void SLTErase(SListNode** pphead, SListNode* pos)
{assert(pphead);assert(pos);if(*pphead == NULL){SListPopFront(pphead);}else{SListNode *prev = *pphead;while(prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);}
}
void SLTDestroy(SListNode *phead)
{SListNode *cur = phead;while(cur != NULL){SListNode *tmp = cur->next;free(cur);cur = tmp;}
}
单链表:在增删节点时,可能需要修改头指针本身(例如删除头节点或插入新头节点),因此需要使用二级指针来修改头指针的地址。
双向带头循环链表:由于头节点固定且循环,增删操作通常只需要修改节点的前驱和后继指针,不需要修改头节点本身,因此不需要二级指针。
2.3 链表面试题
1. 删除链表中等于给定值val的所有节点203. 移除链表元素
class Solution
{
public:ListNode* removeElements(ListNode* head, int val) {ListNode* cur = head;//保存头节点ListNode* prev = nullptr;while(cur != nullptr)//遍历链表{if(cur->val == val){if(prev == nullptr)//头删情况-第一个就是val-直接删,head指向下一个位置{head = cur->next;delete cur;cur = head;}else{prev->next = cur->next;delete cur;cur = prev->next; }}else{prev = cur;cur = cur->next;}}return head;}
};
2. 链表逆置206. 反转链表(考的最多)
方法一:遍历
class Solution
{
public:ListNode* reverseList(ListNode* head) {ListNode* newhead = new ListNode(0);ListNode* cur = head;while(cur){ListNode* next = cur->next;cur->next = newhead->next;newhead->next = cur;cur = next;}cur = newhead->next;delete newhead;return cur;}
};
方法二:递归
class Solution
{
public:ListNode* reverseList(ListNode* head) {if(head == nullptr || head->next == nullptr)//如果是一个节点,直接返回return head;ListNode* newnode = reverseList(head->next);head->next->next = head;head->next = nullptr;return newnode;}
};
3.给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。876. 链表的中间结点
快慢指针:
class Solution
{
public:ListNode* middleNode(ListNode* head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;}
};
4.实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。面试题 02.02. 返回倒数第 k 个节点
//倒数第k个到最后一个的距离是k-1,让slow和fast的距离也是k-1,fast走到最后时slow就是倒数第k个
class Solution
{
public:int kthToLast(ListNode* head, int k) {ListNode* slow = head;ListNode* fast = head;while(--k)//--k走k-1步,k--是走k步{fast = fast->next;}while(fast->next != nullptr){slow = slow->next;fast = fast->next;}return slow->val;}
};
5. 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 21. 合并两个有序链表
方法一:迭代
class Solution
{
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode* newhead = new ListNode(0);ListNode* prev = newhead;ListNode* cur1 = list1;ListNode* cur2 = list2;while(cur1 && cur2){if(cur1->val <= cur2->val){prev->next = cur1;cur1 = cur1->next;}else{prev->next = cur2;cur2 = cur2->next;}prev = prev->next;}while(cur1){prev->next = cur1;cur1 = cur1->next;prev = prev->next;}while(cur2){prev->next = cur2;cur2 = cur2->next;prev = prev->next;}prev = newhead->next;delete newhead;return prev;}
};
方法二:递归
class Solution
{
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 == nullptr || list2 == nullptr){return list1 == nullptr ? list2 : list1;}ListNode* newnode = list1->val > list2->val ? list2 : list1;if(newnode == list1){newnode->next = mergeTwoLists(list1->next, list2);}else{newnode->next = mergeTwoLists(list1, list2->next);}return newnode;}
};
6.给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。面试题 02.04. 分割链表
class Solution
{
public:ListNode* partition(ListNode* head, int x) {if(head==nullptr || head->next==nullptr)return head;ListNode* lessnode = new ListNode(0);ListNode* bignode = new ListNode(0);ListNode* lesshead = lessnode;ListNode* bighead = bignode;ListNode* cur = head;while(cur){if(cur->val < x){lesshead->next = cur;cur = cur->next;lesshead = lesshead->next;lesshead->next = nullptr;}else{bighead->next = cur;cur = cur->next;bighead = bighead->next;bighead->next = nullptr;}}lesshead->next = bignode->next;cur = lessnode->next;delete lessnode;delete bignode;return cur;}
};
7. 链表的回文结构234. 回文链表
为什么不整体翻转然后比较两个头节点:
reverseList 函数会修改原始的链表结构,导致在 isPalindrome 函数中比较时出现问题。具体来说,reverseList 函数会将链表反转,并且将原始链表的 head 节点的 next 指针设置为 nullptr,这会导致原始链表被破坏。
所以只反转一半:
class Solution
{ListNode* reverseList(ListNode* head){if(head==nullptr || head->next==nullptr)return head;ListNode* newhead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newhead;}
public:bool isPalindrome(ListNode* head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}ListNode* mid = slow;//两个中间则是后面那个ListNode* newhead = reverseList(mid);while(head && newhead){if(head->val != newhead->val)return false;head = head->next;newhead = newhead->next;}return true;}
};
原来 1->2->3->2->1null↑
逆置一半:1->2->3<-2<-1
8.给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点LCR 023. 相交链表。
class Solution
{
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int n1 = 0, n2 = 0;ListNode* cur = headA;while(cur){n1++;cur = cur->next;}cur = headB;while(cur){n2++;cur = cur->next;}ListNode* fast = headB;ListNode* slow = headA;if(n1 > n2){fast = headA;slow = headB;}int gap = abs(n1-n2);while(gap--){fast = fast->next;}while(slow && fast){if(slow == fast)return slow;slow = slow->next;fast = fast->next;}return nullptr;}
};
9.给你一个链表的头节点 head ,判断链表中是否有环。141. 环形链表
class Solution
{
public:bool hasCycle(ListNode *head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast)return true;}return false;}
};
证明:
fast一定先进环,当slow进环时,假设fast距离slow有N步,此时slow走N步,fast走2N步,正好能追得上。但是fast一次走3步,4步...是不行的。假设两个元素构成一个环,每次追两步是永远不会相遇的。
10.给定一个链表的头节点 head ,返回链表开始入环的第一个节点。142. 环形链表 II
class Solution
{
public:ListNode *detectCycle(ListNode *head) {ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){ListNode* meet = slow;ListNode* sta = head;while(sta != meet){sta = sta->next;meet = meet->next;}return meet;}}return nullptr;}
};
证明:

11. 链表深度拷贝138. 随机链表的复制
class Solution
{
public:Node* copyRandomList(Node* head) {Node* cur = head;while(cur)//每个结点后链接拷贝结点{Node* copy = new Node(cur->val);Node* next = cur->next;cur->next = copy;copy->next = next;cur = next;}cur = head;while(cur)//拷贝random关系{Node* copy = cur->next;if(cur->random == nullptr)copy->random = nullptr;elsecopy->random = cur->random->next;cur = copy->next;}Node* copynode = new Node(0);Node* copyhead = copynode;cur = head;while(cur)//恢复head和解下copy结点{Node* copy = cur->next;Node* next = copy->next;copyhead->next = copy;copyhead = copy;cur->next = next;cur = next;}cur = copynode->next;delete copynode;return cur;}
};相关文章:
6. 顺序表和链表*****
目录 1. 顺序表 1.1 原理 1.2 常见的增删查改 1.3 顺序表的问题 2. 链表 2.1 原理 2.2 无头单向非循环的增删查改 2.3 链表面试题 1. 删除链表中等于给定值val的所有节点203. 移除链表元素 2. 链表逆置206. 反转链表(考的最多) 3.给你单链表的…...
Vue3 + TS组件封装指南
在 Vue 3 TypeScript 中封装组件时,需要注意以下几点: 1. Props 定义 使用 defineProps 或 PropType 定义组件的 props,并为其添加类型。 示例: import { defineComponent, PropType } from vue;export default defineComponen…...
【AVRCP】蓝牙协议栈深度解析:AVCTP互操作性核心机制与实现细节
目录 一、事务标签(Transaction Label)机制 1.1 事务标签核心规则 1.2 事务标签作用域与并发性 1.3 实现建议与陷阱规避 1.4 协议设计思考 1.5 调试与验证 二、消息分片(Fragmentation)机制 2.1 分片触发条件 2.2 分片支…...
【MySQL】基本查询(下)
文章目录 1.筛选分页结果2.Update3.Delete4.截断表5.插入查询结果6.聚合函数6.1什么是聚合函数6.2常见的聚合函数 7.group by7.1如何显示每个部门的平均工资和最高工资7.2显示每个部门的每种岗位的平均工资和最低工资7.3显示平均工资低于2000的部门和它的平均工资 8.总结 1.筛选…...
Xpath Helper 替代 - XPath 测试器
Xpath Helper 最近开始(2025.03)无法使用了,选找了几款替代品,XPath 测试器 是目前看来最好的。 XPath 测试器 市场地址: https://chromewebstore.google.com/detail/xpath-测试器/cneomjecgakdfoeehmmmoiklncdiodmh …...
C++学习之云盘项目nginx
1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…...
JAVA学习*抽象类
抽象类 在Java中,被abstract关键字修饰的类被称为抽象类。 特点 1、当一个类继承了抽象类,一定要重写抽象方法!!! public abstract class Animal {public int age;public String name;//抽象方法public abstract v…...
数据库管理-第303期 数据库相关硬件文章汇总(20250319)
数据库管理303期 2025-03-19 数据库管理-第303期 数据库相关硬件文章汇总(20250319)1 CPU & 内存2 SSD3 RDMA4 存储5 CXL6 硬件采购7 数据库一体机总结 数据库管理-第303期 数据库相关硬件文章汇总(20250319) 作者࿱…...
WPF 开发从入门到进阶(五)
一、WPF 简介与开发环境搭建 1.1 WPF 概述 Windows Presentation Foundation(WPF)是微软推出的用于构建 Windows 桌面应用程序的强大 UI 框架。它融合了矢量图形、动画、多媒体等多种技术,能让开发者创建出具有高度视觉吸引力和交互性的应用…...
高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?
如果有遗漏,评论区告诉我进行补充 面试官: Eureka是什么? 我回答: 在Java高级面试中,关于Eureka的讨论通常会涵盖其基本概念、组件与架构、工作原理、高级特性以及与其他服务发现工具的比较等多个方面。以下是结合提供的内容对Eureka进行的详细解析和…...
OctoTools:一个具有复杂推理可扩展工具的智体框架
25年2月来自斯坦福大学的论文“OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning”。 解决复杂的推理任务可能涉及视觉理解、域知识检索、数值计算和多步骤推理。现有方法使用外部工具增强大语言模型 (LLM),但仅限于专业领域、有限的…...
uniapp-x web 开发警告提示以及解决方法
defineModel props...
html5表格实战-跨行跨列
效果如图 代码如图...
前端开发概论
HTML,CSS,JS三者关系 html是骨架,决定呈现什么内容,而css定义样式,是华丽的外衣,javascript是操作逻辑,实现按钮等等,是人的灵魂 HTML文件存储着一个网页的骨架,CSS则是外衣,javas…...
Canary
定义: Canary是一种用以防护栈溢出的保护机制。 原理: 是在一个函数的入口处,先从fs/gs寄存器中取出一个4字节(eax,四字节通常是32位的文件)或者8字节(rax,通常是64位的文件)的值…...
c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!
文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…...
BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分
checksec exeinfo 开启了全保护 64位 查看函数: 堆题 增删查改齐了 可以在编辑堆的时候重新设置大小 存在堆溢出 delete函数的指针清零了 无UAF 想法是通过unsorted bin泄露libc基址: from pwn import *p process(./babyheap) #p remote("node…...
【C++指南】内存管理完全手册:new/delete
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C内存管理的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享…...
Vue3组合式函数(滚动监测 useScroll)
主要用于实时监测目标元素滚动位置及状态 工具函数源码 /*** 组合式函数* 实时监测目标元素滚动位置及状态** 自定义钩子用于处理滚动事件和状态* param target 滚动目标元素,可以是 Ref、HTMLElement、Window 或 Document,默认为 window* param throt…...
Vue.js+Element UI 登录界面开发详解【附源码】
成果图: 一、技术架构解析 本登录模块采用前后端分离架构,前端基于Vue.jsElement UI实现交互逻辑,主要包含以下技术要点: 组件化开发 - 采用单文件组件形式组织代码响应式设计 - 实现多终端适配状态管理 - 使用sessionSto…...
瑞幸需要宇树科技
吃不到“星巴克红利”,瑞幸活成“Manner”。 作者|古廿 编辑|杨舟 “是不是又要开始3月革命了。”有瑞幸员工透露,今年开始瑞幸加强了系统排班的执行力度。新的排班体系下,要求各时段门店实际值班人员和排班系统一致。如果需要调整…...
linux 命令 vim
以下是 Linux 中 Vim 编辑器的核心命令总结,分为基础操作、高效编辑技巧和实用场景,助你快速掌握 1. 启动与退出 命令说明vim 文件名打开或新建文件vim 行号 文件名打开文件并跳转到指定行(如 vim 10 file.txt):q退出 Vim&#…...
JS—基本数据类型和引用数据类型:1分钟掌握两者的区别
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–分类三–核心区别四–实际场景中的问题五–总结对比 二. 分类 前面说过这么判断数据类型,今天来说说基本数据类型和引用数据类型的区别。 基本数据类型引用数据类型StringObjectNumberFunct…...
计算机网络的框架结构
计算机网络课程知识体系框架 一、计算机网络基础概念 1.1 网络组成要素 端系统(主机、服务器)通信链路(有线/无线介质)交换设备(路由器、交换机)协议体系(TCP/IP协议簇) 1.2 网络…...
解决MySQL字符集冲突引发的“Illegal mix of collations”错误
引言 在开发过程中,我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例,分析因字符集不匹配导致的 Illegal mix of collations 错误,并提供完整的解决方案,帮助开发者彻底规避此类问题。 问题现象 假设我们…...
Vue中的publicPath释义
publicPath 部署应用包时的基本URL。用法和 webpack 本身的 output.publicPath 一致,但是 Vue CLI 在一些其他地方也需要用到这个值,所以请始终使用 publicPath 而不要直接修改 webpack 的 output.publicPath。 默认情况下,Vue CLI 会假设你…...
python 库笔记:pytorch-tcn
提供以下功能 TCN类Conv1d 和 ConvTranspose1d 层的实现,并带有因果/非因果切换功能流式推理(Streaming Inference)选项,可用于实时应用兼容 ONNX(Open Neural Network Exchange)格式,可在非Py…...
如何使用MySQL快速定位慢SQL问题?企业级开发中常见业务场景中实际发生的例子,涉及分页查询问题。(二)
如何使用MySQL快速定位慢SQL问题? 在企业级开发中,尤其是涉及到订单查询的业务时,经常会发生慢查询的问题。比如用户翻页到后面的页数时,查询变慢,因为传统的LIMIT offset, size在数据量大时效率低下。这时候ÿ…...
新造车不再比拼排名,恰是曲终人散时,剩者为王
据称新能源汽车周销量不再发布,这可能也预示着新造车终于到了给出答案的时候了,新造车企业前三强已基本确立,其余那些落后的车企已很难有突围的机会,而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示,销量最高的…...
博客迁移----宝塔面板一键迁移遇到问题
前景 阿里云轻量级服务器到期了,又免费领了个ESC, 安转了宝塔面板。现在需要迁移数据,使用宝塔面板一键迁移功能,完成了数据的迁移,改了域名的解析,现在进入博客是显示502 bad grateway 宝塔搬家参考链接…...
