15届蓝桥杯备赛(2)

文章目录

  • 刷题笔记(2)
    • 二分查找
      • 在排序数组中查找元素的第一个和最后一个位置
      • 寻找旋转排序数组中的最小值
      • 搜索旋转排序数组
    • 链表
      • 反转链表
      • 反转链表II
    • 二叉树
      • 相同的树
      • 对称二叉树
      • 平衡二叉树
      • 二叉树的右视图
      • 验证二叉搜索树
      • 二叉树的最近公共祖先
      • 二叉搜索树的最近公共祖先
      • 二叉树层序遍历
      • 二叉树的锯齿形层序遍历
      • 找树左下角的值

刷题笔记(2)

二分查找

在排序数组中查找元素的第一个和最后一个位置

[传送门]( 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) )

class Solution {
public://求出第一个大于等于target的下标int ans(vector<int>& nums, int target){int left = 0, right = nums.size() - 1, mid;//左闭右闭区间while(left <= right){mid = left + (right-left)/2;//先减后加防止溢出if(nums[mid] < target){left = mid + 1;}else{right = mid - 1;}}return left;}vector<int> searchRange(vector<int>& nums, int target) {int start = ans(nums, target);if(start == nums.size() || nums[start] != target){return {-1, -1};}int end = ans(nums, target+1) - 1;return {start, end};}
};

看完灵神讲完这题也算是开眼界了,原来二分查找也不仅仅针对找到target值,其实也能找到>=target或<=target的值。题解的ans函数就是找到该数组第一个>=target的下标,然后就是要搞清return的值是哪个,这里return的是left,因为循环结束之后left是在right的右边一个位置,并且小于left下标所表示的值都是小于target的,那么最终left所指的值就是第一个>=target的下标。在ans函数中mid也是值得注意的:java和C++需要考虑到下标可能溢出的问题,就不能mid = (left+right)/2这样写,而应该mid = left + (right-left)/2这样写,一定是先减后加。

再就是主函数if条件是排出了特殊的情况:①数组中所有数都小于target②数组长度为0③数组中所有数都大于target。再就是求end,end表示最后一个>=target的下标,那么可以转化成第一个>=target+1左边的下标,这就是为什么ans函数后面要-1

寻找旋转排序数组中的最小值

[传送门]( 153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode) )

class Solution {
public:int findMin(vector<int>& nums) {int left = 0, right = nums.size()-2, mid;while(left <= right){mid = left + (right-left)/2;if(nums[mid] < nums[nums.size()-1]){right = mid -1;}else{left = mid + 1;}}return nums[left];}
};

从这一题能够看出,采用二分查找法的题目不一定是有序的,二分查找的模板大致都是相同的,难点主要在需要发现合适的判断条件。这里将数组最后一个元素设置为基准,因为它一定是蓝色的(符合条件的),目标值一定在最后一个数或者是它之前的数,所以遍历的区间在[0,n-2]。

搜索旋转排序数组

[传送门]( 33. 搜索旋转排序数组 - 力扣(LeetCode) )

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size()-2, mid;while(left <= right){mid = left + (right-left)/2;if(nums[mid] < nums[nums.size()-1]) right = mid-1;else left = mid+1;}int left2, right2;if(target < nums[nums.size()-1]){left2 = left, right2 = nums.size()-1;while(left2 <= right2){mid = left2 + (right2-left2)/2;if(nums[mid] < target) left2 = mid+1;else if(nums[mid] > target) right2 = mid-1;else return mid;}}else if(target > nums[nums.size()-1]){left2 = 0, right2 = left-1;while(left2 <= right2){mid = left2 + (right2-left2)/2;if(nums[mid] < target) left2 = mid+1;else if(nums[mid] > target) right2 = mid-1;else return mid;}}else return nums.size()-1;return -1;}
};

这道题解决思路比较粗暴,首先按照上一题的解法求出最小元素的下标,然后将最后一个元素与target进行判断,如果target小于nums[n-1]那么再在最小元素的右边二分查找,反之则在最小元素的左边二分查找,所以我的解法使用了两次二分查找,ac了就偷懒每看解析了,解析肯定没这么复杂…

链表

反转链表

[传送门]( 206. 反转链表 - 力扣(LeetCode) )

解法一:双指针迭代

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur = head, *pre = nullptr, *temp;while(cur != nullptr){temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;}
};

三个需要注意的点:①退出循环的条件②循环体第2,3,4条语句的顺序不能变③最后返回的是pre而不是cur,因为cur退出循环变成nullptr了

解法二:头插法

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* res, *pMove = head;res = new ListNode();if(pMove == nullptr) return nullptr;while(pMove != nullptr){ListNode* s = new ListNode;s->val = pMove->val;s->next = res->next;res->next = s;pMove = pMove->next;}return res->next;}
};

按照实例的意思,它将所有元素都反序了,所以我们可以重新创建一个有头节点的链表采用头插法存取数据就能达到反转链表的效果。

反转链表II

[传送门]( 92. 反转链表 II - 力扣(LeetCode) )

class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode* dummy = new ListNode(0, head), *p0 = dummy;for(int i = 0; i < left-1; i++){p0 = p0->next;}ListNode* pre = nullptr, *cur = p0->next, *temp;for(int i = 0; i < right-left+1; i++){temp = cur->next;cur->next = pre;pre = cur;cur = temp;}p0->next->next = cur;p0->next = pre;return dummy->next;}
};

这一题需要找到几个关键结点:①遍历开始前一个结点p0②遍历结束后cur和pre所指结点③设置一个哨兵结点指向head之前,用来作为返回值。遍历结束后p0->next->next一定指向cur,p0->next一定指向pre,而且两个书写顺序不能改变,题中所给的left和right就是边界值,就是我们循环的次数,中间反转链表与第一题相同采用双指针迭代的方法。最后注意为哨兵开辟空间的方法new ListNode(0, head);

二叉树

相同的树

[传送门]( 100. 相同的树 - 力扣(LeetCode) )

class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q) {if(p == nullptr || q == nullptr) return p == q;else{bool left = isSameTree(p->left, q->left);bool right = isSameTree(p->right, q->right);return p->val == q->val && left && right;}}
};

递归题还是得加强理解,现在能分析出递归的边界条件和各个限制条件,但是理解不了这些条件应该放在什么位置,这里递归退出条件写的十分妙,如果是其中一个为nullptr那么返回false,如果都为空那么返回true,如果都为真,那么就继续递归,返回的是当前两个结点val是否相等&&左子树是否相等&&右子树是否相等,自己写的时候没有考虑到当前结点的val是否相等就导致的错误。

对称二叉树

[传送门]( 101. 对称二叉树 - 力扣(LeetCode) )

class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q){if(p == nullptr || q == nullptr) return p == q;return p->val == q->val && isSameTree(p->left, q->right) && isSameTree(p->right, q->left);}bool isSymmetric(TreeNode* root) {return isSameTree(root->left, root->right);}
};

其实这一题和上一题十分相似,只是我们需要换个角度思考一下问题,判断两个树是否相等就是判断当前p、q所指val是否相等&&p左子树是否等于q左子树&&p右子树是否等于q右子树。而看一个树是否对称也就是方向的不同,其他与判断两个树是否相等是一个意思。所以判断对称二叉树的条件是:p、q所指val是否相等&&p左子树是否等于q右子树&&p右子树是否等于q左子树。由于该题函数只有一个root参数,所以我们需要另外写一个函数用来调用即可。

平衡二叉树

[传送门]( 110. 平衡二叉树 - 力扣(LeetCode) )

class Solution {
public:int getHeight(TreeNode* p){if(p == nullptr) return 0;return max(getHeight(p->left), getHeight(p->right)) + 1;}bool isBalanced(TreeNode* root) {if(root == nullptr) return true;else{int x = getHeight(root->left)-getHeight(root->right);if( x >= -1 && x <= 1) return isBalanced(root->left) && isBalanced(root->right);//abs(x)等价于x >= -1 && x <= 1else return false;}}
};

这道题是自己独立ac的,就没有看其他的解题思路了。说说我的理解:首先平衡二叉树的定义为该树的所有结点的左右子树深度差不超过1,也就是绝对值小于等于1。首先采用递归的写法定义一个求结点深度的函数,然后再在主函数中递归调用。

二叉树的右视图

[传送门]( 199. 二叉树的右视图 - 力扣(LeetCode) )

class Solution {
public:vector<int> ans = {};void f(TreeNode* root, int depth){if(root == nullptr) return;else{if(ans.size() == depth){ans.push_back(root->val);}f(root->right, depth+1);f(root->left, depth+1);}}vector<int> rightSideView(TreeNode* root) {f(root, 0);return ans;}
};

真的是看了大神的题解就是能豁然开朗,做题不能仅仅局限于bfs或者dfs,官方就是用这两种解法看起来相当复杂,因为单纯用那两种方法需要考虑的东西太多,理解起来也就费劲。右视图也就是保存这棵树每一层的最右边一个结点,如何将这个问题比较好的转化成代码呢?定义一个存储结点的数组和一个新函数,函数参数包括结点指针和深度,只要在函数体用一条判断数组长度是否等于树深度就能知道这个结点该不该存在数组里,除此之外,必须要保证该函数一定是先递归的右子树再递归左子树,这样才能保证是每一层的最右边结点存入的数组。这里便于理解就将根节点的深度和数组长度都初始化为0。

验证二叉搜索树

[传送门]( 98. 验证二叉搜索树 - 力扣(LeetCode) )

class Solution {
public:bool examTree(TreeNode* root, long l_limit, long r_limit){if(root == nullptr) return true;else{if(root->val > l_limit && root->val < r_limit){return examTree(root->left, l_limit, root->val) && examTree(root->right, root->val, r_limit);}return false;}}bool isValidBST(TreeNode* root) {return examTree(root, LONG_MIN, LONG_MAX);}
};

首先要仔细解读题目中所给的二叉搜索树的定义,这些定义就是用来限制的条件,所以我们每当访问一个根节点的时候只需要判断其是否在这个范围之内就行。再就是怎么将这个边界往下传,只需定义一个函数参数分别是root指针和左右边界就行了,每次递归左子树就更新右边界、递归右子树就更新左边界,直到遇到了空结点就表明之前的递归都满足条件,那么就返回true。

二叉树的最近公共祖先

[传送门]( 236. 二叉树的最近公共祖先 - 力扣(LeetCode) )

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr || root == p || root == q){return root;}TreeNode* l_left = lowestCommonAncestor(root->left, p, q);TreeNode* l_right = lowestCommonAncestor(root->right, p, q);if(l_left && l_right){return root;}return l_left ? l_left : l_right;}
};

这道题没写出来有两个问题:①读题不仔细:没有从给出的代码中发现p和q是指针类型的②这一道题其实能偶通过分类讨论分析出递归的思路。

在这里插入图片描述

还有,我什么时候才能像题解一样写出这么简洁的题解啊555…分类讨论的形式在代码中能很明白的体现出来,这就是大神的威力啊,狠狠膜拜了。

二叉搜索树的最近公共祖先

[传送门]( 235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) )

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root->val < p->val && root->val < q->val){return lowestCommonAncestor(root->right, p, q);}else if(root->val > p->val && root->val > q->val){return lowestCommonAncestor(root->left, p, q);}return root;}
};

这一题刚开始看的时候我发现其实跟上一题的解法可以完全相同,然后我就重新默写了一遍上一题的代码而且能ac,但我仔细一想这一题肯定有不同的解法。题干中写到这是一颗二叉搜索树,我就在想二叉搜索树会有什么性质呢?我想到的是它的中序遍历是一个升序的序列,所以我在想是不是只要递归出第一个处于[p->val,q->val]之间的数,那个数对应的root值就是我想要的答案,结果是我写不出代码。。。看了题解之后发现是从另一角度出发思考的:根节点值严格大于左子树的所有值&&根节点值严格小于右子树所有值,又因为题干中给出p和q是一定存在的,所以整个题只需要分三部分考虑:①根节点值都小于p和q的值,递归右子树②根节点值都大于p和q的值,递归左子树③其他情况返回root根节点即可。

二叉树层序遍历

[传送门]( 102. 二叉树的层序遍历 - 力扣(LeetCode) )

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {if(root == nullptr) return {};//没有考虑特殊情况,测试样例不能通过vector<vector<int>> v;queue<TreeNode*> q;q.push(root);while(!q.empty()){vector<int> temp;int n = q.size();for(int i = 0; i < n; i++){if(q.front()->left) q.push(q.front()->left);if(q.front()->right) q.push(q.front()->right);temp.push_back(q.front()->val);q.pop();}v.push_back(temp);}return v;}
};

这一道题唯一卡住我思路的地方就是返回的是一个二维数组,如果是一个一维数组,那很好办用一个队列即可。可是这里的二维数组硬是卡着我不知道怎么打码,仔细点来说就是我不知道如何按层存取二叉树里的元素。看了一眼解决方法我就直到如何写了,脑子就是一时间转不过来,唉。方法就是嵌套循环,外层循环是队列为空退出为条件,内层循环只需遍历该层的个数次就行了。可是这么写少考虑到了一种情况,也就是如果该二叉树为空,循环里面会报错(出现空指针的操作)导致测试用例不能通过,不要问是谁漏了,问就是我漏了。

二叉树的锯齿形层序遍历

[传送门]( 103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode) )

自己写的:

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {if(root == nullptr) return {};deque<TreeNode*> d;vector<vector<int>> v;d.push_back(root);int flag = 1;//1表示从左往右,-1表示从右往左while(!d.empty()){int n = d.size(), i;vector<int> temp;if(flag == 1){for(i = 0; i < n; i++){if(d.front()->left) d.push_back(d.front()->left);if(d.front()->right) d.push_back(d.front()->right);temp.push_back(d.front()->val);d.pop_front();}}else if(flag == -1){for(i = 0; i < n; i++){if(d.back()->right) d.push_front(d.back()->right);if(d.back()->left) d.push_front(d.back()->left);temp.push_back(d.back()->val);d.pop_back();}}v.push_back(temp);flag = -flag;}return v;}
};

大佬写的:

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {if(root == nullptr) return {};vector<vector<int>> v;queue<TreeNode*> q;q.push(root);for(int flag = false; !q.empty(); flag = !flag){vector<int> temp;for(int i = q.size(); i > 0; i--){TreeNode* node = q.front();if(node->left) q.push(node->left);if(node->right) q.push(node->right);temp.push_back(node->val);q.pop();}if(flag) reverse(temp.begin(), temp.end());v.push_back(temp);}return v;}
};

大佬写的代码就是简洁高效啊,实在是佩服。我的代码的思路是:想到这题和二叉树层序遍历之间只多了一个遍历顺序的条件,所以我就先按照层序遍历的写法写,flag是用来判断该层是用从左往右还是从右往左,还有,考虑到需要一个数据结构能对其进行两端操作的队列,这里我就用到了双端队列,它能对首尾插入和删除。

再看到优化的代码:第一个循环用的for,这是我从未见过的一种写法,是在是巧妙,就相当于我的while和if条件写在一起了。再就是存取每层数据时它不是对队列进行改变,而是对临时数组进行反转函数reverse,它用一行代替了我两个for循环,天呐这这么想到的…

本人就爱写点发牢骚的话hahahaha反正也没什么人看。

找树左下角的值

[传送门]( 513. 找树左下角的值 - 力扣(LeetCode) )

自己的解法:

class Solution {
public:vector<vector<int>> orderResearch(TreeNode* root){vector<vector<int>> v;queue<TreeNode*> q;q.push(root);while(!q.empty()){vector<int> temp;for(int i = q.size(); i > 0; i--){TreeNode* node = q.front();if(node->left) q.push(node->left);if(node->right) q.push(node->right);temp.push_back(node->val);q.pop();}v.push_back(temp);}return v;}int findBottomLeftValue(TreeNode* root) {vector<vector<int>> v = orderResearch(root);return v[v.size()-1][0];}
};

想到前两题返回的都是层序遍历的结果,我就在想,树左下角的值不就是最后一层的第一个值吗,我就重新写了一个层序遍历的函数并返回二维数组,结果就是v[v.size()-1] [0]。v.size()的值表示v的行数

解法二:

class Solution {
public:int findBottomLeftValue(TreeNode* root) {queue<TreeNode*> q;TreeNode* node;q.push(root);while(!q.empty()){node = q.front();if(node->right) q.push(node->right);if(node->left) q.push(node->left);q.pop();}return node->val;}
};

看上去就是普通的层序遍历吗?不,这里不同在两个if的顺序,我们正常的层序遍历是从左至右所以是先node->left再node->right,这样最后一个元素是最右下角的元素,该题是要求出最左下角的元素,那么我们只需要改两个if条件的顺序就能达到题目的意思啦

解法三:

class Solution {
public:vector<int> v = {};void func(TreeNode* root, int depth){if(root == nullptr) return;if(depth == v.size()){v.push_back(root->val);}func(root->left, depth+1);func(root->right, depth+1);}int findBottomLeftValue(TreeNode* root) {func(root, 0);return v[v.size()-1];}
};

这个解法来自于评论区的朋友,看到了这样的评论"可以考虑二叉树的左视图,然后返回左视图的最后一个元素",左视图?怎么这么熟悉,哦!原来我写过右视图,然后我大脑迅速运转回顾右视图该怎么写,由于参数的限定,这里需要重新定义一个函数和一个全局的数组v并初始化为空,函数的参数为root指针和整形depth表示该层的深度(这个depth是跟着递归的,递归到那一层depth也就跟着更新,这里我写的时候没有想到,我将depth也设置为全局变量结果输出的是树中最后一个元素…还是细节决定成败啊),然后就是先调用root->left再调用root->right因为左视图优先看到的是左子树,所以先遍历左子树哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为 java 开发者设计的性能测试框架,用于压测+测试报告生成

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) junitperf junitperf 是一款为 java 开…

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SO-BP蛇算法优化BP神经网络多变量回归预测&#xff08;完整源码和数据) …

婚恋相亲红娘牵线系统功能介绍

婚恋相亲红娘牵线系统是一个综合性的婚恋交友平台&#xff0c;它集成了多种功能以帮助用户找到心仪的伴侣。以下是其主要功能的详细介绍&#xff1a; 用户信息深度分析和匹配&#xff1a;该系统利用大数据和人工智能技术&#xff0c;对用户的基本信息&#xff08;如年龄、身高…

基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 ​编辑2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA结果导入到matlab显示结果如下&#xff1a; matlab的对比测试结果如下&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a…

Pytest 教程:从 0 到 1 搭建 Pytest 接口自动化测试项目

从 0 到 1 搭建 Pytest 接口自动化测试项目 1.创建项目目录 mkdir Pytest-API-Testing-Demo 2.项目初始化 // 进入项目文件夹下cd Pytest-API-Testing-Demo// 创建项目 python 项目虚拟环境python -m venv .env// 启用项目 python 项目虚拟环境source .env/bin/activate 3…

ubuntu下docker安装

目录 官网链接 安装步骤 docker使用方法 拉取镜像 创建镜像 运行镜像 查看运行结果 保存镜像文件 传输到windows下 官网链接 Install Docker Engine on Ubuntu | Docker Docs 安装步骤 1.运行以下命令卸载所有冲突的包&#xff1a; for pkg in docker.io docker-d…

基于Spring Boot的社区便民服务管理系统的设计与实现

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

【海贼王的数据航海】排序——冒泡|快速|归并排序|总结

目录 1 -> 交换排序 1.1 -> 冒泡排序 1.1.1 -> 代码实现 1.2 -> 快速排序 1.2.1 -> hoare版本 1.2.2 -> 挖坑法 1.2.3 -> 前后指针法 1.2.4 -> 快速排序(递归版) 1.2.5 -> 快速排序(非递归版) 2 -> 归并排序 2.1 -> 归并排序 2.…

js逆向-某东cfe滑块逆向分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 分析 网址&#xff1a; aHR0cHM6Ly9jZmUubS5qZC5jb20vcHJpdmF…

CTF题型 SSTI(2) Flask-SSTI典型题巩固

CTF题型 SSTI(2) Flask-SSTI典型题巩固 文章目录 CTF题型 SSTI(2) Flask-SSTI典型题巩固前记1.klf__sstiSSTI_Fuzz字典&#xff08;网上收集自己补充&#xff09; 2.klf_2数字问题如何解决了&#xff1f;|count |length都被禁&#xff1f; 3.klf_3 前记 从基础到自己构造paylo…

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(rpm方式)

实现&#xff1a;mysql-5.7.42 到 mysql-8.2.0 的升级&#xff08;rpm方式&#xff09; 1、升级准备1、使用mysql-shell 检查工具检查兼容性 2、操作环境3、备份数据库、my.cnf文件&#xff0c;停止mysql服务&#xff08;重要&#xff09;4、上传、解压安装包5、查看已安装的my…

第十三届蓝桥杯省赛真题 Java C 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 排列字母试题 B: 特殊时间试题 C: 纸张尺寸试题 D: 求和试题 E : \mathbf{E}: E: 矩形拼接试题 F: 选数异或试题 G: GCD试题 H: 青蛙过河试题 I: 因数平方和试题 J \mathrm{J} J : 最长不下降子序列 发现宝藏 前些天发现了一个巨牛的人…

一周学会Django5 Python Web开发-Jinja3模版引擎-模板语法

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计37条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

问界汽车提车全流程及注意点【伸手党福利】

问界汽车提车全流程及注意点 目录 说明为没买车和没提车的小伙伴提供参考全程必须车主办理&#xff08;人必须在场&#xff09;&#xff0c;如果不是车主授权书很难办。时间&#xff1a;提车用时4小时&#xff0c;2个人 提车提前联系-交付专员做好需求调研当天-到店验车-千万不…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

算法——位运算(一篇搞定)

本专栏为大家分享本人学习算法遇到的不同类型的题目以及解析! 此篇文章给大家分享一些关于位运算算法的题目,在开篇还讲述了常见位运算的公式以及题目,如果对您有帮助,麻烦点个关注,如有错误,请您指出! 1.常见位运算总结(包含5道题目) 1.1基础位运算 运算符操作<<左移&…

vue 部署 abap BSP

How to Create a Vue.Js App with VS Code and Deploy... - SAP Community 详情见上面这个教程连接 Open VS Code and open a terminal window and run npm install -g vue/cli restart vscode. Open a terminal window again and go to your workspace folder to create the…

国密算法 SM9 公钥加密 数字签名 密钥交换 基于身份的密码算法(IBC)完整高效的开源python代码

上篇文章&#xff08;发布于2023-09-18&#xff09;给自己挖了个坑&#xff0c;说是要搞定SM9。从国庆前一周开始&#xff0c;到现在一个月时间&#xff0c;这个坑终于填上了。此前信息安全数学基础太差&#xff0c;理解不了SM9双线性对、扩域计算等等&#xff0c;为此还特意选…

由浅到深认识C语言(6):变量的存储类型

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

想做好国际现货黄金行情交易 请从这样的预期开始

国际现货黄金行情以多变而著称&#xff0c;而这样多变的行情&#xff0c;又由于其趋势稳定&#xff0c;而深受投资者喜爱。我们看近期&#xff0c;国际现货黄金行情不断上涨&#xff0c;短线呈现出很强的上涨趋势&#xff0c;这正是投资者入场交易的好时机&#xff0c;但是要做…