剑指offer第一周
目录
二维数组中的查找
旋转数组的最小数字
调整数组顺序使奇数位于偶数前面
数组中出现次数超过一半的数字
替换空格
从尾到头打印链表
重建二叉树
矩形覆盖
链表中倒数最后k个结点
二进制中1的个数
合并两个排序的链表
树的子结构
二叉树的镜像
二维数组中的查找
解法:模拟
第一种想到的做法是两层for循环来查找,但会超时;
优化:两层for循环查找本质是一个一个排查,根据题目的行递增与列递增:根据第一行的最大值:第一行的最后一个元素(或者第一列的最后一个)作为参照物:
如果target比我大,说明target不可能在当前行,往下找;
如果target比我小,说明target不可能在当前列,往左找;
#include <algorithm>
class Solution
{
public:bool Find(int target, vector<vector<int>> &array){int i = 0, j = array[0].size() - 1;while (i < array.size() && j >= 0){if (array[i][j] < target)i++; // 排除一行else if (array[i][j] > target)j--; // 排除一列elsereturn true;}return false;}
};
旋转数组的最小数字
解法:二分
数组通过非递减的方式以某个下标为旋转点进行旋转后,此时会分为两段非递减区域:左半段区域的所有值全都大于有半段的所有值,找出单调性(题目要用logn时间)我们就可能尝试使用二分解决:以nums[right]作为参照物(以nums[left]作为操作物情况有n多种),根据以下动图理解移动逻辑:
//a[right]作为参照物
class Solution
{
public:int minNumberInRotateArray(vector<int> &nums){int left = 0, right = nums.size() - 1;// 要以a[right]为参照物while (left < right){int mid = (left + right) / 2;// mid和right都在右半段且目标值在mid左边if (nums[mid] < nums[right])right = mid;// mid在左半段区间else if (nums[mid] > nums[right])left = mid + 1;// 不知道mid情况,right往后移动缩小范围elseright--;}return nums[left];}
};//以a[left]作为参照物
class Solution
{
public:int minNumberInRotateArray(vector<int> &nums){int left = 0, right = nums.size() - 1;while (left < right){if (left + 1 == right)break; // 这里不判断会死循环int mid = (left + right) / 2;// nums[left] nums[mid] nums[right]三者都相等,只能在该范围内一个一个查找// 例如:[2,2,2,1,2]if (nums[left] == nums[mid] && nums[mid] == nums[right]){int minval = 10001;for (int i = 0; i <= right; i++)minval = min(minval, nums[i]);return minval;}if (nums[left] <= nums[mid])//说明目标值在mid右边left = mid;else//说明目标值在mid左边right = mid;}return min(nums[left], nums[right]);}
};
调整数组顺序使奇数位于偶数前面
解法1:模拟
创建数组,先枚举奇数统计,再枚举偶数统计
解法2:插入排序
使用插入排序思想:枚举到奇数位置时,把奇数插入到偶数前面
可以直接套用插入排序代码,但是可以将它进行优化:
其中使用k表示:【0,k】区间内已经完成奇数位于偶数前面;假设枚举到i位置,此时它是奇数时,只需移动移动(k,i)区间的偶数整体向前移动一个单位即可;
class Solution
{
public:vector<int> reOrderArray(vector<int> &array){int n = array.size(), k = 0;for (int i = 0; i < n; i++){if (array[i] & 1) // 枚举到奇数时{int tmp = array[i], j = i;//(k,j)未移动while (j > k){array[j] = array[j - 1];j--;}array[k++] = tmp;}}return array;// 下面代码优化:用k表示:[0,k]区间已经移动完成// int n=array.size(),k=0;// for(int i=0;i<n;i++)// {// if(array[i] & 1)//枚举到奇数时// {// int tmp=array[i],j=i;// //(k,j)未移动// while(j>k)// {// array[j]=array[j-1];// j--;// }// array[k++]=tmp;// }// }// return array;// 插入排序的思想,找奇数前插到偶数前// int n=array.size();// for(int i=0;i<n;i++)// {// if(array[i] & 1)//枚举到奇数时// {// int tmp=array[i],j=i-1;// while(j>=0)// {// if((array[j] & 1) ==0)//偶数往后移// {// array[j+1]=array[j];// j--;// }// else break;// }// array[j+1]=tmp;// }// }// return array;// vector<int> ret;// for(auto& e:array)// {// if(e%2!=0) ret.push_back(e);// }// for(auto& e:array)// {// if(e%2==0) ret.push_back(e);// }// return ret;}
};
数组中出现次数超过一半的数字
(前提:输入数据必有答案,所以次数最多的数字就是答案)
解法1:哈希表
哈希表统计后出现次数最多的数字(时间 O(n) 空间 O(n))
解法2:排序
排序完后中间的数字就是出现次数最多的数字(时间 O(nlogn) 空间 O(n))
解法3:候选法
定义变量people为当前候选人,定义变量cnt为1表示当前people人数;进行遍历时如果遇到相等就cnt++,否则就cnt--;当cnt为0时说明当前people一定不是出现次数最多的人(因为次数最多的cnt不会有等于0的情况),重新选择下一个候选人进行遍历..直到枚举结束,当前people即为数组中出现次数最多数字(时间 O(n)空间O(1))
class Solution
{
public:int MoreThanHalfNum_Solution(vector<int> &numbers){int n = numbers.size(), people = numbers[0], cnt = 1, j = 1;while (j < n){if (cnt == 0){people = numbers[j];cnt = 1;j++;}if (people == numbers[j])cnt++;elsecnt--;j++;}return people;}
};
替换空格
解法:模拟
方法1:重新定义一个string:从前往后遍历s:如果遇到空格,就添加"%20";否则就添加原有字符
方法2:先遍历一遍找出有多少空格(一个空格就多加2个位置的空间),计算string一共需要多少空间,定义两个指针:begin指向原来string的末尾,end指向预留空间的string的末尾;如果s[begin]等于空格,end就要从后往前一次添加‘0’ ‘2’ ‘%’,否则就添加s[begin]的字符
class Solution
{
public:string replaceSpace(string s){int k = 0;for (auto &e : s){if (e == ' ')k++;}int begin = s.size() - 1, length = s.size() + 2 * k;s.resize(length);int end = length - 1;while (end > 0){if (s[begin] == ' '){s[end--] = '0';s[end--] = '2';s[end--] = '%';begin--;}else{s[end--] = s[begin--];}}return s;// string ret;// for(auto& e:s)// {// if(e==' ') ret+="%20";// else ret+=e;// }// return ret;}
};
从尾到头打印链表
解法1:模拟
基本链表的头插操作,然后把新链表遍历节点保留在数组中;
解法2:递归
递归到尾节点存值到数组中
class Solution
{
public:vector<int> ret;void dfs(ListNode *head){if (head == nullptr)return;dfs(head->next);ret.push_back(head->val);}vector<int> printListFromTailToHead(ListNode *head){dfs(head);return ret;// ListNode* tmp=new ListNode(-1),*tail=nullptr;// while(head)// {// ListNode*next=head->next;// head->next=tail;// tmp->next=head;// tail=head;// head=next;// }// ListNode* head1=tmp->next;// delete tmp;// vector<int> ret;// while(head1)// {// ret.push_back(head1->val);// head1=head1->next;// }// return ret;}
};
重建二叉树
解法:递归
重复子问题
通过前序数组的第一个根的值,将中序数组分为左右子树两个区间;
根据中序数组的左子树区间计算出左子树的个数;
通过左子树的个数就可以将前序数组也分为左右子树两个区间;
接下来通过前序数组的第二个根的值再次划分区间...
在划分区间(递归)之前把根的值new出来,等到左右子树通过递归构建好后就return
#include <vector>
class Solution {
public:TreeNode* dfs(vector<int>& pre,int pre_begin,int pre_end,vector<int>& vin,int vin_begin,int vin_end){if(pre_begin>pre_end) return nullptr;TreeNode* root=new TreeNode(pre[pre_begin]);for(int i=vin_begin;i<=vin_end;i++){if(vin[i]==pre[pre_begin]){//找到中序遍历后的根节点,把它划分成左右子树两段区间【vin_begin,i-1】 i 【i+1,vin_end】//前序遍历中左子树节点区间【pre_begin+1, pre_begin+1 + i-1-vin_begin+1(vin左子树的个数)-1】root->left=dfs(pre,pre_begin+1,pre_begin+i-vin_begin,vin,vin_begin,i-1);//前序遍历中左子树节点区间就好计算了root->right=dfs(pre,pre_begin+i-vin_begin+1,pre_end,vin,i+1,vin_end);}}return root;}TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {if(preOrder.empty()) return nullptr;return dfs(preOrder,0,preOrder.size()-1,vinOrder,0,vinOrder.size()-1);}
};//前后序重建二叉树
TreeNode* dfs(int prev[], int pre_begin, int pre_end, int after[], int aft_begin, int aft_end)
{if (pre_begin>pre_end) return nullptr;TreeNode* root = new TreeNode(prev[pre_begin]);if (pre_begin == pre_end) return root;//剩下一个直接返回int tmp = prev[pre_begin + 1],leftsize;//通过前序遍历的下一个节点来确定左右子树个数for (int i = aft_begin; i <= aft_end; i++){if (tmp == after[i]){leftsize = i - aft_begin + 1;break;}}root->left = dfs(prev, pre_begin + 1, pre_begin +leftsize, after, aft_begin, aft_begin+leftsize-1);root->right = dfs(prev, pre_begin + leftsize + 1, pre_end, after, aft_begin + leftsize, aft_end - 1);return root;
}//中后序重建二叉树
TreeNode* dfs(int mid[], int mid_begin, int mid_end, int after[], int aft_begin, int aft_end)
{if (mid_begin>mid_end||aft_begin>aft_end) return nullptr;TreeNode* root = new TreeNode(after[aft_end]);int tmp = after[aft_end];//通过前序遍历的下一个节点来确定左右子树个数for (int i = mid_begin; i <= mid_end; i++){if (tmp == mid[i]){root->left = dfs(mid, mid_begin, i - 1, after, aft_begin, aft_begin + i - mid_begin - 1);root->right = dfs(mid, i+1, mid_end, after, aft_begin + i - mid_begin, aft_end - 1);break;}}return root;
}
矩形覆盖
解法:规律
斐波那契数的变形
class Solution
{
public:int rectCover(int number){if (number < 4)return number;int a = 2, b = 3, c;while (number >= 4){c = a + b;a = b;b = c;number--;}return c;}
};
链表中倒数最后k个结点
解法1:模拟
统计节点个数n后从头节点走n-k步就到指定的位置
解法2:前后双指针
它们从头节点开始:先让前指针走k步,再让它们一起走...直到前指针为空停止,返回后指针;如果前指针走不到k步(走到k步)为空,直接返回空
class Solution
{
public:ListNode *FindKthToTail(ListNode *pHead, int k){// 前后指针进行移动ListNode *front = pHead, *rear = pHead;while (k-- && front)front = front->next;// 如果没有倒数第k个节点不进来while (front){front = front->next;rear = rear->next;}return k >= 0 ? front : rear;// 根据节点个数n后走n-k步// ListNode* head=pHead;// int n=0;// while(head)// {// n++;// head=head->next;// }// if(n-k<0) return nullptr;// n-=k;// while(n--)// {// pHead=pHead->next;// }// return pHead;}
};
二进制中1的个数
解法:位运算
n的32位与1 &,为1代表这一位是1
或者 n = n & (n-1) 每进行一次n的最后位数(从左到右)的1被消除
class Solution
{
public:int NumberOf1(int n){int ret = 0;while (n){ret++;n &= (n - 1); // 每次减少二进制的1}// for(int i=0;i<32;i++)// {// if(1&(n>>i)) ret++;// }return ret;}
};
解法1:三指针
定义三个指针指向节点进行反转移动,有一定的细节
解法2:递归
明白每一层在干什么? 把后一个的节点的下一个节点指向自己,向上返回尾节点
解法2:头插法
利用带头链表进行插头最简单~
class Solution
{
public:ListNode *ReverseList(ListNode *head){// 三指针// 空或者一个节点不用移动if (head == nullptr || head->next == nullptr)return head;ListNode *prev = head, *mid = head->next, *tail = head->next->next;while (tail){mid->next = prev;prev = mid;mid = tail;tail = tail->next;}// mid在尾节点mid->next = prev;// 头节点的下一个值空head->next = nullptr;return mid;// 递归// if(head==nullptr || head->next==nullptr) return head;// ListNode*Phead = ReverseList(head->next);// if(head->next) head->next->next=head; //后面节点连接前面节点// head->next=nullptr; //为了第一个节点的下一个置空// return Phead;// 头插法// ListNode* Phead=new ListNode(-1),*tail=nullptr;// while(head)// {// ListNode* next=head->next;// head->next=tail;// Phead->next=head;// tail=head;// head=next;// }// ListNode* ret=Phead->next;// delete Phead;// return ret;}
};
合并两个排序的链表
解法1:双指针
从左向右同时遍历两个链表,取小的节点进行尾插后往后走,直到一个或者两个链表为空后直接将另一个链表进行尾插
解法2:递归
递归之前去小的节点放到定义的head节点中,然后往后走,直到一个或者两个链表为空后直接将另一个链表进行尾插
class Solution
{
public:ListNode *Merge(ListNode *pHead1, ListNode *pHead2){// 递归if (pHead1 == nullptr)return pHead2;else if (pHead2 == nullptr)return pHead1;ListNode *head = nullptr; //,*tail=head;if (pHead1->val < pHead2->val){head = pHead1;pHead1 = pHead1->next;}else{head = pHead2;pHead2 = pHead2->next;}head->next = Merge(pHead1, pHead2);return head;// 比较节点大小进行合并超时// if(pHead1==nullptr) return pHead2;// else if(pHead2==nullptr) return pHead1;// ListNode* head=nullptr,*tail=nullptr;// while(pHead1 && pHead2)// {// if(pHead1->val<=pHead2->val)// {// if(head==nullptr) head=tail=pHead1;// else// {// tail->next=pHead1;// tail=pHead1;// }// pHead1=pHead1->next;// }// else// {// if(head==nullptr) head=tail=pHead2;// else// {// tail->next=pHead2;// tail=pHead2;// }// pHead2=pHead2->next;// }// }// if(pHead1==nullptr) tail->next=pHead2;// else if(pHead2==nullptr) tail->next=pHead1;// return head;}
};
树的子结构
解法:递归
递归1:找两颗数的头节点是否相同,相同就让一个递归函数IsSame帮助我们判断;
递归2:判断两颗数是否相同采用的是前序遍历思想:先比较头节点,头节点相同就递归比较左右子树,两种情况都为true就表明两颗树是相同的
class Solution
{
public:bool IsSame(TreeNode *root1, TreeNode *root2){// root2为空就说明找到结尾了if (root2 == nullptr)return true;// root1为空就说明在root1中没有root2的节点if (root1 == nullptr)return false;if (root1->val == root2->val)return IsSame(root1->left, root2->left) && IsSame(root1->right, root2->right);elsereturn false;}bool HasSubtree(TreeNode *pRoot1, TreeNode *pRoot2){// 空树不是任意一个树的子结构if (pRoot1 == nullptr || pRoot2 == nullptr)return false;if (pRoot1->val == pRoot2->val){if (IsSame(pRoot1, pRoot2))return true;}return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);}
};
二叉树的镜像
解法:递归
前序遍历的思想:从根节点开始,交换左右子树的节点
class Solution
{
public:TreeNode *Mirror(TreeNode *pRoot){if (pRoot == nullptr)return nullptr;TreeNode *tmp = pRoot->left;pRoot->left = pRoot->right;pRoot->right = tmp;Mirror(pRoot->left);Mirror(pRoot->right);return pRoot;}
};
以上便是全部内容,有问题欢迎在评论区指正,感谢观看!
相关文章:
剑指offer第一周
目录 二维数组中的查找 旋转数组的最小数字 调整数组顺序使奇数位于偶数前面 数组中出现次数超过一半的数字 替换空格 从尾到头打印链表 重建二叉树 矩形覆盖 链表中倒数最后k个结点 二进制中1的个数 合并两个排序的链表 树的子结构 二叉树的镜像 二…...
素数筛(欧拉筛算法)
#include<bits/stdc.h> using namespace std; #define maxn 100000 int vis[maxn]; int prime[maxn]; //欧拉筛函数 int Euler_sieve(int n) { int i,j,k; k0;//保存素数的个数 memset(vis,0,sizeof(int)*maxn);//初始化数组 for(i2;i<n;i) { if(vis[i]0)//i是素数…...
遨游科普:三防平板是什么?有什么功能?
清晨的露珠还挂在帐篷边缘,背包里的三防平板却已开机导航;工地的尘土飞扬中,工程师正通过它查看施工图纸;暴雨倾盆的救援现场,应急队员用它实时回传灾情数据……这些看似科幻的场景,正因三防平板的普及成为…...
CSS 浮动与定位以及定位中z-index的堆叠问题
CSS 浮动与定位以及定位中z-index的堆叠问题 一、浮动布局的特点与应用 1. 浮动核心特性 脱离标准流:浮动元素会脱离文档流。环绕特性:后续内容会环绕浮动元素排列自动换行:多个浮动元素在容器宽度不足时自动换行 .float-box {float: lef…...
在Maven中替换文件内容的插件和方法
在Maven中替换文件内容的插件和方法 Maven提供了几种方式来替换文件内容,以下是常用的插件和方法: 1. maven-replacer-plugin (推荐) 这是专门用于文件内容替换的插件,功能强大且灵活。 基本配置 <plugin><groupId>com.goog…...
C# lock
在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块。这是一种简单的同步机制,用来防止多个线程同时访问共享资源或执行需要独占访问的代码段(临界区),从而…...
OGGMA 21c 微服务 (MySQL) 安装避坑指南
前言 这两天在写 100 天实战课程 的 OGG 微服务课程: 在 Oracle Linux 8.10 上安装 OGGMA 21c MySQL 遇到了一点问题,分享给大家一起避坑! 环境信息 环境信息: 主机版本主机名实例名MySQL 版本IP 地址数据库字符集Goldengate …...
NPN、PNP三极管的应用
由于电路知识实在是难以拿出手,在面试的时候被问到三极管相关问题,相当地尴尬。在网上简要地学习了相关的理论知识,在这里给出自己的理解。更为基础的原理在这里并不提及。我们面向实际应用学习即可。 我们知道常见的三极管总是硅管ÿ…...
Cadence Allegro安装教程及指导
Cadence Allegro 是一款专业的 PCB 设计软件,被广泛应用于电子行业。它功能强大,能够处理复杂的电路板设计任务。下面为你详细介绍 Cadence Allegro 的安装步骤。 一、安装前准备 在安装 Cadence Allegro 之前,需要进行一系列准备工作&…...
阿里通义万相 Wan2.1-VACE:开启视频创作新境界
2025 年 5 月 14 日,阿里巴巴为视频创作领域带来了重磅惊喜 —— 开源通义万相 Wan2.1-VACE。这一模型堪称视频生成与编辑领域的集大成者,凭借其全面且强大的功能,为广大创作者、开发者以及企业用户开辟了全新的视频创作天地。它打破了以往视…...
mAP、AP50、AR50:目标检测中的核心评价指标解析
在目标检测任务中,评价指标是衡量模型性能的核心工具。其中,mAP(mean Average Precision)、AP50(Average Precision at IoU0.5)和AR50(Average Recall at IoU0.5)是最常用的指标。本…...
Linux进程异常退出排查指南
在 Linux 中,如果进程无法正常终止(如 kill 命令无效)或异常退出,可以按照以下步骤排查和解决: 1. 常规终止进程 尝试普通终止(SIGTERM) kill PID # 发送 SIGTERM 信号(…...
深入解析:如何基于开源OpENer开发EtherNet/IP从站服务
一、EtherNet/IP协议概述 EtherNet/IP(Industrial Protocol)是一种基于以太网的工业自动化通信协议,它将CIP(Common Industrial Protocol)封装在标准以太网帧中,通过TCP/IP和UDP/IP实现工业设备间的通信。作为ODVA(Open DeviceNet Vendors Association)组织的核心协议…...
【Linux 学习计划】-- yum
目录 什么是yum Linux的生态讲解 yum相关操作 yum源 yum配置相关问题 结语 什么是yum 我们的手机上都有手机自带的软件商城,我们下载软件都可以在上面搜索,安装,下载 而我们的yum就是这么一个东西,他其实就是Linux下的安装…...
Qt 强大的窗口停靠浮动
1、左边: 示例代码: CDockManager::setConfigFlags(CDockManager::DefaultOpaqueConfig); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); dockManager new CDockManager(this); // Disabling the Internal Style S…...
Flink 数据传输机制
在 Apache Flink 中,数据传输(Data Transmission)机制 是其分布式流处理能力的核心之一。Flink 通过高效的内部数据交换、网络通信和序列化机制,确保任务之间的数据能够高效、可靠地流动。 一、Flink 数据传输的基本流程 Source …...
数据库——SQL约束窗口函数介绍
4.SQL约束介绍 (1)主键约束 A、基本内容 基本内容 p r i m a r y primary primary k e y key key约束唯一表示数据库中的每条记录主键必须包含唯一的值(UNIQUE)主键不能包含NULL值(NOT NULL)每个表都应…...
第8讲、Multi-Head Attention 的核心机制与实现细节
🤔 为什么要有 Multi-Head Attention? 单个 Attention 机制虽然可以捕捉句子中不同词之间的关系,但它只能关注一种角度或模式。 Multi-Head 的作用是: 多个头 多个视角同时观察序列的不同关系。 例如: 一个头可能专…...
【发票提取表格】批量PDF电子发票提取明细保存到Excel表格,批量提取ODF电子发票明细,行程单明细,单据明细保存到表格,使用步骤、详细操作方法和注意事项
在日常办公中,我们常常会面临从大量 PDF 电子发票、ODF 电子发票、行程单及各类单据中提取明细,并整理到 Excel 表格的艰巨任务。手动操作不仅耗时费力,还极易出错。以下为您详细介绍其使用步骤、操作方法、注意事项及应用场景。 一、适用场…...
React中startTransition的使用
// 引入 React 的 Hook API:useState 管理状态、useTransition 处理非紧急更新、useMemo 缓存计算结果 import { useState, useTransition, useMemo } from react;/*** List 组件:* 根据输入的 query 动态渲染一个包含 10000 条数据的列表*/ function Li…...
Reactor (epoll实现基础)
Reactor 是什么? Reactor 网络模型是一种高性能的事件驱动模型,广泛应用于网络编程中。它通过 I/O 多路复用技术,实现了高效的事件处理和系统吞吐量的优化。 核心概念 Reactor 模型_的核心是事件驱动,即当 I/O 事件准备就绪时_…...
php fiber 应用
参考 基于 PHP Fiber(纤程)的游戏开发分析-腾讯云开发者社区-腾讯云PHP 8.1 引入的 Fibers 为游戏开发带来新机遇,能管理渲染、物理计算等任务且不阻塞主线程。它支持并发,提升效率,简单易用,但也有局限&a…...
前端扫盲HTML
文章目录 下载、安装、运行第一个代码(hello world)创建代码文件编辑代码(hello world)HTML常见标签注释标签标题标签段落标签换行标签格式化标签图片标签表格标签列表标签表单标签下拉菜单无语义标签 参考文档 下载、安装、运行第…...
RAG与微调:企业知识库落地的技术选型
从本质上看,RAG是"让模型查阅外部知识",而微调是"让模型学会并内化知识"。这一根本差异决定了它们在不同场景下的适用性。 技术选型的关键依据 场景RAG微调说明模型定制化需求❌✅微调更适合塑造特定风格、口吻和人格特征硬件资源…...
Linux安全篇 --firewalld
一、Firewalld 防火墙概述 1、Firewalld 简介 firewalld 的作用是为包过滤机制提供匹配规则(或称为策略),通过各种不同的规则告诉netfilter 对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式为了更加方便地组织和管理防火墙,firewalld 提供…...
关于Android Studio for Platform的使用记录
文章目录 简单介绍如何使用配置导入aosp工程配置文件asfp-config.json 简单介绍 Android Studio for Platform是google最新开发,用来阅读aosp源码的工具 详细的资料介绍: https://developer.android.google.cn/studio/platform 将工具下载下来直接点击…...
搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
写在前面 使用搜索引擎是我们经常做的事情,搜索引擎的实现原理。 什么是搜索引擎 搜索引擎是一种在线搜索工具,当用户在搜索框输入关键词时,搜索引擎就会将与该关键词相关的内容展示给用户。比较大型的搜索引擎有谷歌,百度&…...
【找工作系列①】【大四毕业】【复习】巩固JavaScript,了解ES6。
文章目录 前言Tasks:复习笔记:JavaScript是什么?JavaScript有什么用或者换句话说 是做什么的?JavaScript由哪几部分组成?BOM?DOM?html文件中script标签放在哪里?🧩 1. **放在 ****<head>**** 中**✅ 优点&…...
Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接
Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接 1 说明2 客户端配置jdk环境3服务器检查oracle数据库补丁4设置ssla 服务器配置walletb 上传测试脚本和配置文件到客户端c 服务器修改数据库侦听和sqlnet.orad 修改客户端的sqlnet.ora和tnsnames.ora的连接符e 修改java代码的数据连接…...
本地部署开源网盘系统 kiftd 并实现外部访问(Linux 版本)
kiftd 是一款专为个人、团队及小型组织设计的开源网盘系统,兼具便捷性、跨平台兼容性与丰富的功能,成为替代传统文件共享工具的理想选择。 本文将详细介绍如何在 Linux 系统本地部署 kiftd 并结合路由侠实现外网访问本地部署的 kiftd 。 第一步&#x…...
ECS/GEM是半导体制造业的标准通信协议中host和equipment的区别是什么,在交互过程中,如何来定位角色谁为host,谁为equipment
文章目录 一、角色定义与核心区别1. Host(主机)2. Equipment(设备)3. Host与Equipment的核心区别 二、交互过程中的角色定位1. 交互方向2. 控制层级3. 交互过程中角色的定位方法3.1. 通信发起方向3.2. 协议功能与状态管理3.3. 物理…...
5000 字总结CSS 中的过渡、动画和变换详解
CSS 中的过渡、动画和变换详解 一、CSS 过渡(Transitions) 1. 基本概念 CSS 过渡是一种平滑改变 CSS 属性值的机制,允许属性值在一定时间内从一个值逐渐变化到另一个值,从而创建流畅的动画效果。过渡只能用于具有中间值的属性&…...
2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…...
WebXR教学 09 项目7 使用python从0搭建一个简易个人博客
WebXR教学 09 项目7 使用python从0搭建一个简易个人博客(1) 前期设计规划 功能 呈现个人博客文章 技术选型 HTMLCSSJSPythonFlask 环境准备 VS Code Python3.8 代码实现 包 # 创建虚拟环境(-m 会先将模块所在路径加入 sys.path,更适…...
c++从入门到精通(五)--异常处理,命名空间,多继承与虚继承
异常处理 栈展开过程: 栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch子句为止;也可能一直没找到匹配的catch,则退出主函数后查找过程终止。栈展开过程中的对象被自动销毁。 在栈展开的过程中,…...
开源安全大模型Foundation-Sec-8B实操
一、兴奋时刻 此时此刻,晚上22点55分,从今天早上6点左右开始折腾,花费了接近10刀的环境使用费,1天的休息时间,总算是把Foundation-Sec-8B模型跑起来了,中间有两次胜利就在眼前,但却总在远程端口转发环节出问题,让人难受。直到晚上远程Jupyter访问成功那一刻,眉开眼笑,…...
现代优化算法全解析:禁忌搜索算法、模拟退火算法、遗传算法、蚁群优化算法、人工神经网络
现代优化算法全解析:禁忌搜索算法、模拟退火算法、遗传算法、蚁群优化算法、人工神经网络 引言:为什么需要优化算法? 在当今这个数据驱动的时代,优化算法已成为计算机科学、工程设计、人工智能等领域的核心工具。无论是训练神经…...
Docker常见命令解读
上图是对docker常见命令的一个图解,方便大家理解,下面,我将对这些命令做一些解释。 一、镜像生命周期管理 1. 镜像构建(Build) docker build -t my-image . # 根据Dockerfile构建镜像 Dockerfile:…...
为什么 Docker 建议关闭 Swap
在使用 Docker 时,关闭系统 Swap(交换分区) 是一个常见的推荐做法,尤其是在生产环境中。虽然 Docker 不强制要求禁用 Swap,但出于性能、稳定性、可控性和资源管理的目的,通常建议这样做。 为什么 Docker 建…...
TIFS2024 | CRFA | 基于关键区域特征攻击提升对抗样本迁移性
Improving Transferability of Adversarial Samples via Critical Region-Oriented Feature-Level Attack 摘要-Abstract引言-Introduction相关工作-Related Work提出的方法-Proposed Method问题分析-Problem Analysis扰动注意力感知加权-Perturbation Attention-Aware Weighti…...
WPS PPT设置默认文本框
被一个模板折磨了好久,每次输入文本框都是很丑的24号粗体还有行标,非常恶心,我甚至不知道如何描述自己的问题,非常憋屈,后来终于知道怎么修改文本框了。这种软件操作问题甚至不知道如何描述问题本身,非常烦…...
支持selenium的chrome driver更新到136.0.7103.94
最近chrome释放新版本:136.0.7103.94 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...
“下一辆车还买小米”
大家好,我是小悟。 就在5月13日,江西上饶德兴街头,一辆紫色小米SU7 Max停在路边,却遭遇了一场堪比灾难片的意外。 一辆满载货物的大货车因手刹故障溜坡,径直撞向SU7,两车从两米高的落差坠落,货…...
opencv4.11生成ArUco标记 ArUco Marker
从opencv4.7开始aruco有了一些变化 以下是opencv4.11生成ArUco标记的小例子 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/objdetect/aruco_detector.hpp>int main() {cv::Mat markerImage;cv::aruco::Dictionary dictionary cv…...
从辅助到协作:GitHub Copilot的进化之路
如果说现代程序员的标配工具除了VS Code、Stack Overflow之外,还有谁能入选,那一定是GitHub Copilot。从2021年首次亮相,到如今深度集成进开发者日常流程,这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了,而…...
QMK 宏(Macros)功能详解(实战部分)
QMK 宏(Macros)功能详解(实战部分) 一、宏的基本概念与作用 宏(Macros)是 QMK 固件中一项强大的功能,它允许您在按下单个按键时执行多个按键操作。通过宏,您可以: 输入常用短语或文本执行复杂的按键组合自动化重复性操作触发系统功能或快捷键🔔 安全提示:虽然可以…...
SVN 版本控制入门指南
SVN 版本控制系统详细入门指南 一、SVN 基础概念详解 1. 什么是版本控制? 版本控制是一种记录文件变化的系统,可以: 追踪文件的修改历史查看每次修改的内容恢复到任意历史版本协调多人协作开发 2. SVN 核心概念 2.1 仓库(Re…...
6to4、6over4的类比解释
本文由deepseek生成,特此声明 1. 6to4:自动的“快递中转站” 类比场景: 假设你住在一个偏远的小镇(IPv6网络),周围被大海(IPv4互联网)包围,你想给另一个偏远小镇&#…...
跨国应用程序的数据存储方案常见的解决方案
一、数据隐私与合规性 跨国数据存储方案必须遵守不同国家和地区的数据隐私法律和规定,例如: GDPR(欧盟一般数据保护条例)CCPA(加利福尼亚消费者隐私法案)各国的本地数据存储法规解决方案: 采用本地化存储:在不同国家或地区设立数据存储中心,以遵循当地的法律和隐私要…...
JSP链接MySQL8.0(Eclipse+Tomcat9.0+MySQL8.0)
所用环境 Eclipse Tomcat9.0 MySQL8.0.21(下载:MySQL Community Server 8.0.21 官方镜像源下载 | Renwole) mysql-connector-java-8.0.21(下载:MySQL :: Begin Your Download) .NET Framework 4.5.2(下…...