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

栈和队列OJ题目——C语言

目录

LeetCode 20、有效的括号

题目描述:

思路解析:

解题代码: 

通过代码: 

LeetCode 225、用队列实现栈

题目描述:

思路解析:

解题代码: 

通过代码:

LeetCode 232、用栈实现队列

题目描述:

思路解析:​编辑

解题代码:

通过代码:

LeetCode 622、设计循环队列

题目描述:

思路解析:

解题代码:

通过代码:


LeetCode 20、有效的括号

题目描述:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路解析:

利用栈先进后出的特点,让栈内元素依次与新元素比较。 

解题代码: 

我们还是要先拷贝一份栈放在OJ题目上方,并且注意我们需要更改STDataType为char类型,我们要更改的不止这些,我们还要改一下我们的assert,我们要把暴力的判断变成温柔的判断,其中重点是STPop和STTop:

根据思路写出如下代码: 

我们根据我们的思路写出了如上代码,实验后发现通过所有测试案例,在提交时却出现错误,经过调试后发现,当传入一个括号时,会跳过我们判错的代码,直接来到判对:

这就是我们的数量不匹配,我们可以在最后进行一个判空,如果最后栈没空,说明数量不匹配。 

这样一修改就可以啦。

通过代码: 

typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);bool STEmpty(ST* pst);
int STSize(ST* pst);void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}void STPop(ST* pst)
{assert(pst);if(!pst->top > 0){return;}pst->top--;
}STDataType STTop(ST* pst)
{assert(pst);if(!pst->top > 0){return 0;}return pst->a[pst->top - 1];
}bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}bool isValid(char* s) 
{ST st;STInit(&st);while (*s){if (*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);}else{char top = STTop(&st);STPop(&st);if ((*s == ')' && top == '(') || (*s == ']' && top == '[') || (*s == '}' && top == '{')){;}else{return 0;}}++s;}bool ans = STEmpty(&st);STDestroy(&st);return ans;
}

LeetCode 225、用队列实现栈

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

进阶:你能否仅用一个队列来实现栈。

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路解析:

首先我们先复习一下栈和队列的性质

此时我们的两个队列,他们的功能分别是存储数据和导出数据 

解题代码: 

此时因为我们需要用到队列,所以我们需要先把我们写的队列拷贝一份在OJ代码上面:

同时也别忘记我们在队列部分写过的函数,我们可以不用自己判空,在插入时哪个不为空我们就插入到哪个队列,此时那个队列是专门用来存储数据的。

在删除时,我们也可以使用QueueSize对队列数据的个数进行判断,用QueueFront进行导入队头操作,此时该队列承担的是导数据的任务, 同时导入队头的同时不要忘记要将队头Pop出去。

在去栈首的时候,我们取到的是队列的最后一个元素,首先想到的肯定是返回我们导完数据后剩的那个元素,直接CV上面的代码,但是我们要能想到在写队列时,我们写过取队尾函数QueueBack,我们可以直接进行判空操作,返回不为空队列的最后一个元素。

当然判空也很简单,我们只需要同时判断两个队列即可。 

最后free时,我们可以直接释放我们malloc的MyStack* pst呢?我们来画张图看一下

所以在free掉栈之前要把两个队列先free,由于不知道哪个为空,所以我们两个都free。

通过代码:

typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);
int QueueSize(Queue* pq);void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}void QueuePop(Queue* pq)
{assert(pq); assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL)pq->ptail = NULL;pq->size--;
}QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}typedef struct
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate()
{MyStack* pst = (MyStack*)malloc(sizeof(MyStack));QueueInit(&(pst->q1));QueueInit(&(pst->q2));return pst;
}void myStackPush(MyStack* obj, int x)
{if (!QueueEmpty(&obj->q1))QueuePush(&obj->q1, x);elseQueuePush(&obj->q2, x);
}int myStackPop(MyStack* obj)
{Queue* noneempty = &obj->q1;//用noneempty指向非空栈Queue* empty = &obj->q2;//用empty指向空栈if (!QueueEmpty(&obj->q2)){noneempty = &obj->q2;empty = &obj->q1;}while (QueueSize(noneempty) > 1){QueuePush(empty, QueueFront(noneempty));QueuePop(noneempty);}int top = QueueFront(noneempty);QueuePop(noneempty);return top;
}int myStackTop(MyStack* obj)
{if (!QueueEmpty(&obj->q1))return QueueBack(&obj->q1);elsereturn QueueBack(&obj->q2);
}bool myStackEmpty(MyStack* obj)
{return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj)
{QueueDestroy(&obj->q1);QueueDestroy(&obj->q1);free(obj);obj = NULL;
}

LeetCode 232、用栈实现队列

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:

  • 1 <= x <= 9
  • 最多调用 100 次 pushpoppeek 和 empty
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

思路解析:

 

解题代码:

我认为代码的唯一难点就是在于什么时候导数据,在哪个函数时要把PushSt中的元素导入PushSt

我们可以在STPeek中导数据,然后可以在STPop时再调用STPeek,再进行STPop

通过代码:

typedef char STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* pst);
void STDestroy(ST* pst);
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);bool STEmpty(ST* pst);
int STSize(ST* pst);void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}void STPop(ST* pst)
{assert(pst);if (!(pst->top > 0)){return;}pst->top--;
}STDataType STTop(ST* pst)
{assert(pst);if (!(pst->top > 0)){return 0;}return pst->a[pst->top - 1];
}bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}typedef struct 
{ST PushSt;ST PopSt;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* pq = (MyQueue*)malloc(sizeof(MyQueue));STInit(&pq->PushSt);STInit(&pq->PopSt);return pq;
}void myQueuePush(MyQueue* obj, int x)
{STPush(&obj->PushSt, x);
}int myQueuePop(MyQueue* obj)
{int front = myQueuePeek(obj);STPop(&obj->PopSt);return front;
}int myQueuePeek(MyQueue* obj)
{if (STEmpty(&obj->PopSt)){while (!STEmpty(&obj->PushSt)){STPush(&obj->PopSt, STTop(&obj->PushSt));STPop(&obj->PushSt);}}return STTop(&obj->PopSt);
}bool myQueueEmpty(MyQueue* obj) 
{return obj->PopSt.top == NULL && obj->PushSt.top == NULL;
}void myQueueFree(MyQueue* obj) 
{STDestroy(&obj->PopSt);STDestroy(&obj->PushSt);free(obj);obj = NULL;
}

LeetCode 622、设计循环队列

题目描述:

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

  • 所有的值都在 0 至 1000 的范围内;
  • 操作数将在 1 至 1000 的范围内;
  • 请不要使用内置的队列库。

OJ题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

思路解析:

 

 

解题代码:

我们先对我们存储容器进行定义,这里我们以数组为例: 

 然后先看一下我们刚才已经解决了的问题的代码块,判空和判满: 

 

对于插入和删除,我们只需要对front和back下标进行操作即可:

 

但是不只只是这样就结束了,我们在很多地方都应该判断队列是否满或者是否空,比如插入时判断是否已满,取头取尾时判断是否为空,具体代码大家可以看通过代码。

通过代码:

typedef struct 
{int* a;int front;int back;int k;    
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int) * (k + 1));obj->front = 0;obj->back = 0;obj->k = k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{return obj->front == obj->back;
}bool myCircularQueueIsFull(MyCircularQueue* obj)
{return obj->front == (obj->back + 1) % (obj->k + 1);
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{if (myCircularQueueIsFull(obj)){return false;}obj->a[obj->back] = value;obj->back++;obj->back %= (obj->k + 1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{if (myCircularQueueIsEmpty(obj)){return false;}++obj->front;obj->front %= (obj->k + 1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) 
{if(myCircularQueueIsEmpty(obj)){return -1;}else if (obj->back == 0){return obj->a[obj->k];}else{return obj->a[obj->back - 1];}
}void myCircularQueueFree(MyCircularQueue* obj) 
{free(obj->a);free(obj);
}

相关文章:

栈和队列OJ题目——C语言

目录 LeetCode 20、有效的括号 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 225、用队列实现栈 题目描述&#xff1a; 思路解析&#xff1a; 解题代码&#xff1a; 通过代码&#xff1a; LeetCode 232、用栈…...

System-V共享内存和基于管道通信实现的进程池

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…...

Python武器库开发-前端篇之CSS基本语法(三十)

前端篇之CSS基本语法(三十) CSS简介 CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页外观和布局的样式表语言。它与 HTML 一起&#xff0c;帮助开发者对网页进行美化和布局。CSS通过定义网页元素的颜色、字体、大小、背景、边框等属性&#xff0c;使网页变得更加美…...

微信小程序实现类似Vue中的computed、watch功能

微信小程序实现类似Vue中的computed、watch功能 构建npm使用 构建npm 创建包管理器 进入小程序后&#xff0c;打开终端&#xff0c;点击顶部“视图” - “终端” 新建终端 使用 npm init -y初始化包管理器&#xff0c;生成一个package.json文件 安装 npm 包 npm install --…...

[JVM] 美团二面,说一下JVM数据区域

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。这些区域有不同的用途。 文章目录 线程私有的数据区域1. 程序计数器2. Java 虚拟机栈3. 本地方法栈 线程共享的数据区域1. Java 堆2. 方法区3. 运行时常量池4. 直接内存 线程私有的数据区域 …...

【React】useReducer

让 React 管理多个相对关联的状态数据 import { useReducer } from "react" // 1. 定义reducer函数&#xff0c;根据不同的action返回不同的状态 function reducer(state, action) {switch (action.type) {case ADD:return state action.payloadcase SUB:return st…...

leetcode刷题详解二

160. 相交链表 本质上是走过自己的路&#xff0c;再走过对方的路&#xff0c;这是求两个链表相交的方法 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//本质上是走过自己的路&#xff0c;再走过对方的路if(headA NULL|| headB NULL){return NULL;}Lis…...

利用opencv/暗通道方法检测图像是否有雾-利用opencv/暗通道方法对深度学习目标检测算法结果进行二次识别提高准确率

目录 1 Python版本 2 C++版本 本来利用yolov5检测浓雾的,但是发现yolov5的检测结果会把一些正常天气检测成雾天,这种时候其实可以通过增加正常类,也就是将正常天气被误检成浓雾的图片当成一个正常类别去训练,但是不想标注图片,也不想重新训练算法了,因此想是不是可以用…...

Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip

Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip 文章目录 Linux | 重定向 | 文件概念 | 查看文件 | 查看时间 | 查找文件 | zip一、more1.1 输出重定向>和>>1.2 输入重定向< 二、 再谈一切皆文件三、less指令【重要】四、head指令五、tail指令…...

【广州华锐互动】利用VR体验环保低碳生活能带来哪些教育意义?

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进了我们的生活。从游戏娱乐到教育培训&#xff0c;VR技术的应用范围越来越广泛。而在这个追求绿色、环保的时代&#xff0c;VR技术也为我们带来了一种全新的环保低碳生活方式。让我们一起走进…...

python爬虫中 HTTP 到 HTTPS 的自动转换

前言 在当今互联网世界中&#xff0c;随着网络安全的重要性日益增加&#xff0c;越来越多的网站采用了 HTTPS 协议来保护用户数据的安全。然而&#xff0c;许多网站仍然支持 HTTP 协议&#xff0c;这就给我们的网络爬虫项目带来了一些挑战。为了应对这种情况&#xff0c;我们需…...

卷积神经网络(CNN)识别验证码

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据3. 查看数据4.标签数字化 二、构建一个tf.data.Dataset1.预处理函数2.加载数据3.配置数据 三、搭建网络模型四、编译五、训练六、模型评估七、保存和加载模型八、预测 …...

使用 PyODPS 采集神策事件数据

文章目录 一、前言二、数据采集、处理和入库2.1 获取神策 token2.2 请求神策数据2.3 数据处理-面向数组2.4 测试阿里云 DataFrame 入库2.5 调度设计与配置2.6 项目代码整合 三、小结四、花絮-避坑指南第一坑&#xff1a;阿里云仅深圳节点支持神策数据第二坑&#xff1a;神策 To…...

罗技M590鼠标usb优联连接不上

手里有一个罗技M590鼠标从18年4月一直用到现在&#xff0c;质量很好&#xff0c;除了滚轮有些松别的没毛病。最近一台笔记本电脑办公不太够用&#xff0c;又领了一个台式机&#xff0c;就想到M590支持双模连接&#xff0c;并且支持Flow&#xff0c;就把usb优联接收器从电池仓拿…...

天池 机器学习算法(一): 基于逻辑回归的分类预测

pytorch实战 课时7 神经网络 MSE的缺点&#xff1a;偏导值在输出概率值接近0或者接近1的时候非常小&#xff0c;这可能会造成模型刚开始训练时&#xff0c;偏导值几乎消失&#xff0c;模型速度非常慢。 交叉熵损失函数&#xff1a;平方损失则过于严格&#xff0c;需要使用更合…...

45岁后,3部位“越干净”,往往身体越健康,占一个也要恭喜!

众所周知&#xff0c;人的生命有长有短&#xff0c;而我们的身体健康状态&#xff0c;也同样会受到年龄的影响&#xff0c;就身体的年龄层次而言&#xff0c;往往需要我们用身体内部的干净程度来维持&#xff0c;换句话说就是&#xff1a;若是你的身体内部越干净&#xff0c;那…...

Windows安装Hadoop运行环境

1、下载Hadoop 2、解压Hadoop tar zxvf hadoop-3.1.1.tar.gz3、设置Hadoop环境变量 3.1.1、系统环境变量 # HADOOP_HOME D:\software\hadoop-3.1.13.1.2、Path 环境变量 %HADOOP_HOME%\bin %HADOOP_HOME%\sbin3.1.3、修改Hadoop文件JAVA_HOME 注 : 路径中不要出现空格 ,…...

软件测试 | MySQL 主键约束详解:保障数据完整性与性能优化

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…...

深入了解Linux中的scp命令及高级用法

Linux操作系统中&#xff0c;scp&#xff08;Secure Copy Protocol&#xff09;命令是一个用于在本地系统和远程系统之间安全复制文件的强大工具。通过基于SSH的加密通信&#xff0c;scp提供了安全的文件传输方式。在本文中&#xff0c;我们将深入介绍scp命令的基本语法以及一些…...

moviepy 视频剪切,拼接,音频处理

官网 使用matplotlib — moviepy-cn 文档 案例 from moviepy.editor import * from moviepy.video.fx import resize from PIL import Imagefile1r"D:\xy_fs_try\video_to_deal\spider_video\file\vedeo3.mp4" file2r"D:\xy_fs_try\video_to_deal\spider_video\…...

OCR + 自动翻译:跨境电商批量铺货方案(支持多语言自动识别)

OCR 自动翻译&#xff1a;跨境电商批量铺货方案&#xff08;支持多语言自动识别&#xff09; 跨境电商最大的问题不是选品&#xff0c;而是&#xff1a; &#x1f449; 语言处理成本太高 商品图是中文平台是英文 / 日文 / 西班牙文人工翻译效率极低 一、解决方案 商品图片…...

如何快速掌握跨平台绘图工具:简单三步解决方案

如何快速掌握跨平台绘图工具&#xff1a;简单三步解决方案 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同操作系统间的Visio文件兼容性问题而烦恼吗&#xff1f;&am…...

现代化Windows游戏工具箱架构解析:Snap.Hutao核心原理与生产环境部署指南

现代化Windows游戏工具箱架构解析&#xff1a;Snap.Hutao核心原理与生产环境部署指南 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Tr…...

Windows屏幕标注终极指南:免费开源工具ppInk完全教程

Windows屏幕标注终极指南&#xff1a;免费开源工具ppInk完全教程 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 在数字化教学、远程会议和产品演示日益普及的今天&#xff0c;拥有一款得心应手的屏幕标注工具变得尤为重要。…...

告别卡顿!在IMX6ULL上用LVGL 9.0+FFmpeg+OpenCV打造丝滑的本地监控GUI(附源码思路)

告别卡顿&#xff01;在IMX6ULL上用LVGL 9.0FFmpegOpenCV打造丝滑的本地监控GUI 在嵌入式开发中&#xff0c;流畅的图形界面往往被视为奢侈的需求——尤其是当硬件平台采用像IMX6ULL这样的中低端处理器时。但现实情况是&#xff0c;越来越多的智能设备需要同时处理视频流和复杂…...

5个高级技巧完全指南:专业级AMD Ryzen系统调试与优化实战手册

5个高级技巧完全指南&#xff1a;专业级AMD Ryzen系统调试与优化实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…...

告别网络依赖:Android原生TTS+讯飞引擎实现纯离线中英语音合成

告别网络依赖&#xff1a;Android原生TTS讯飞引擎实现纯离线中英语音合成 在移动应用开发中&#xff0c;语音合成技术&#xff08;TTS&#xff09;已成为提升用户体验的重要功能。然而&#xff0c;大多数云服务方案存在隐私泄露风险&#xff0c;且依赖稳定网络连接。本文将深入…...

RS485组网避坑指南:从1200米距离到32个节点,你的布线、匹配和程序延时都做对了吗?

RS485组网实战&#xff1a;破解长距离多节点通信的7大技术难题 在工业自动化现场调试RS485网络时&#xff0c;工程师们常常会遇到这样的场景&#xff1a;明明按照手册接好了终端电阻&#xff0c;线缆也符合规范&#xff0c;但通信就是时断时续。某个角落的传感器偶尔会"失…...

用AG10KSDE176 FPGA点亮LED灯屏:从Altera EP4CE10迁移到国产芯片的实战避坑指南

从Altera EP4CE10到AG10KSDE176&#xff1a;LED灯屏控制器的国产FPGA迁移实战 第一次将LED灯屏控制器从Altera Cyclone IV迁移到国产AG10KSDE176 FPGA时&#xff0c;我在硬件原理图阶段就踩了个大坑——误以为两者可以Pin-to-Pin兼容。当第一批打样的PCB板无法正常工作时&#…...

告别F8乱按!用OllyDbg调试破解一个简单注册框的保姆级实录

从零开始用OllyDbg破解简单注册框&#xff1a;新手逆向实战指南 逆向工程的世界总是充满神秘感&#xff0c;而OllyDbg&#xff08;简称OD&#xff09;就像一把打开这扇大门的金钥匙。记得我第一次接触逆向时&#xff0c;面对满屏的十六进制代码和汇编指令&#xff0c;那种既兴奋…...