day9 10-牛客67道剑指offer-JZ66、19、20、75、23、76、8、28、77、78
文章目录
- 1. JZ66 构建乘积数组
- 暴力解法
- 双向遍历
- 2. JZ19 正则表达式匹配
- 3. JZ20 表示数值的字符串
- 有限状态机
- 遍历
- 4. JZ75 字符流中第一个不重复的字符
- 5. JZ23 链表中环的入口结点
- 快慢指针
- 哈希表
- 6. JZ76 删除链表中重复的结点
- 快慢指针
- 三指针
- 如果只保留一个重复结点
- 7. JZ8 二叉树的下一个结点
- 数组保存结点
- 直接查找 分类讨论
- 8. JZ28 对称的二叉树
- 9. JZ77 按之字形顺序打印二叉树
- 栈实现
- 队列实现
- 10. JZ78 把二叉树打印成多行
1. JZ66 构建乘积数组
暴力解法
class Solution {
public:vector<int> multiply(vector<int>& A) {// write code herevector<int> result(A.size(), 0);int flag, res, index = 0;while(index < result.size()){flag = A[index];res = 1;//cout << "flag = " << flag << endl;for(int i=0; i<A.size(); i++){if(A[i] == flag && i==index) continue;res *= A[i];}result[index] = res;index++;}return result;}
};
双向遍历
class Solution {
public:vector<int> multiply(vector<int>& A) {//双向遍历int len = A.size();vector<int> result(len, 1);int cur = 1;//先乘左边,从左到右for(int i=1; i<A.size(); i++){//每多一位由数组B左边的元素多乘一个前面A的元素result[i] = result[i-1] * A[i - 1];//cur *= A[i];result[i] = cur;}//再乘右边,从右到左for(int i=len-1; i>=0; i--){result[i] *= cur;//左右两边都乘起来cur *= A[i];//cur为右边的累乘}return result;}
};
2. JZ19 正则表达式匹配
好难啊,我真的服了,搬运K神题解
- 解题思路:
初始化
初始化首行
dp数组更新
class Solution {
public:bool isMatch(string s, string p) {//1.dp定义 s前i个字符和p前j个字符都匹配 不包括i、jint m = s.size()+1, n = p.size()+1;vector<vector<bool>> dp(m, vector<bool>(n, false));//2.初始化dp[0][0] = true;//两个字符串都为空for(int j=2; j<n; j+=2)//s空 p不空dp[0][j] = dp[0][j-2] && p[j-1]=='*';//如果j-1是* 看j-2的匹配状态//3.更新dp/*for(int i=1; i<m; i++){for(int j=1; j<n; j++){dp[i][j] = p[j-1] == '*' ?dp[i][j-2] || dp[i-1][j] && (s[i-1] == p[j-2] || p[j-2] == '.') :dp[i-1][j-1] && (p[j-1]=='.' || s[i-1]==p[j-1]);}}*/for(int i=1; i<m; i++){for(int j=1; j<n; j++){if(p[j-1] == '*'){if(dp[i][j-2]) dp[i][j] = true;// *可以为0,所以aa和aab*中 *前前一个字符匹配,就可以匹配// 此时看不加s串最后一个字母,能不能匹配到这个位置,如果能的话,// 再看 * 前面的字母和s串新加的这个字母一样不,如果一样,就能匹配,如果不一样,因为此时s串多了一个字母,// 就无法跟现在的 p 进行匹配了;例如:从 aa 可以匹配 aab* ,但是 aaa 匹配到 aab* 的时候,dp[i - 1][j]为true,// 但是s[i - 1] 与 p[j - 2]不一样,就无法匹配;else if(dp[i-1][j] && s[i-1]==p[j-2]) dp[i][j] = true;// 但是,如果 * 的前一个字符是万能的 . ,即可匹配;else if(dp[i-1][j] && p[j-2]=='.') dp[i][j] = true;}else{// 不是 * 的情况下,新加的两个字符相同,则可以继续匹配if(dp[i-1][j-1] && s[i-1]==p[j-1]) dp[i][j] = true;// 新加的字符不同,但是 p 中新加的是万能的 . ,就能随便匹配;else if(dp[i-1][j-1] && p[j-1]=='.') dp[i][j] = true;}}}return dp[m-1][n-1]; }
};
3. JZ20 表示数值的字符串
无语了,又很难的样子,搬运力扣K神的题解了。
有限状态机
-
解题思路:
本题使用有限状态自动机。根据字符类型和合法数值的特点,先定义状态,再画出状态转移图,最后编写代码即可。 -
字符类型:
空格:「 」、数字:「 0—90—90—9 」、正负号:「 +−±+− 」、小数点:「 … 」、幂符号:「 eEeEeE 」。 -
状态定义:
按照字符串从左到右的顺序,定义以下 9 种状态。- 0 开始的空格
- 1 幂符号前的正负号
- 2 小数点前的数字
- 3 小数点、小数点后的数字
- 4 当小数点前为空格时,小数点、小数点后的数字
- 5 幂符号
- 6 幂符号后的正负号
- 7 幂符号后的数字
- 8 结尾的空格
-
结束状态,合法的结束状态有 2, 3, 7, 8 。
class Solution {
public:bool isNumber(string s) {//2.有限状态机unordered_map<State, unordered_map<CharType, State>> transfer{{ STATE_INTITIAL, //初始状态{{CHAR_SPACE, STATE_INTITIAL},{CHAR_NUMBER, STATE_INTEGER}, {CHAR_POINT, STATE_DOT_WITHOUT_INT}, {CHAR_SIGN, STATE_INT_SIGN}} },{ STATE_INT_SIGN,{{CHAR_NUMBER, STATE_INTEGER}, {CHAR_POINT, STATE_DOT_WITHOUT_INT}} },{ STATE_INTEGER,{{CHAR_NUMBER, STATE_INTEGER},{CHAR_EXP, STATE_EXP},{CHAR_POINT, STATE_DOT},{CHAR_SPACE, STATE_END}}},{ STATE_DOT,{{CHAR_NUMBER, STATE_FRACTION},{CHAR_EXP, STATE_EXP}, {CHAR_SPACE, STATE_END}}},{STATE_DOT_WITHOUT_INT, {{CHAR_NUMBER, STATE_FRACTION}}}, {STATE_FRACTION,{{CHAR_NUMBER, STATE_FRACTION},{CHAR_EXP, STATE_EXP},{CHAR_SPACE, STATE_END}}}, {STATE_EXP,{{CHAR_NUMBER, STATE_EXP_NUMBER},{CHAR_SIGN, STATE_EXP_SIGN}}}, {STATE_EXP_SIGN, {{CHAR_NUMBER, STATE_EXP_NUMBER}}}, {STATE_EXP_NUMBER, {{CHAR_NUMBER, STATE_EXP_NUMBER},{CHAR_SPACE, STATE_END}}}, {STATE_END, {{CHAR_SPACE, STATE_END}}}};int len = s.size();State st = STATE_INTITIAL;for(int i=0; i<len; i++){CharType typ = toCharType(s[i]);if(transfer[st].find(typ) == transfer[st].end()) return false;else st = transfer[st][typ];}return st == STATE_INTEGER || st==STATE_DOT || st==STATE_FRACTION || st==STATE_EXP_NUMBER || st==STATE_END;}enum State{STATE_INTITIAL,STATE_INT_SIGN,STATE_INTEGER,STATE_DOT,STATE_DOT_WITHOUT_INT,STATE_FRACTION,STATE_EXP,STATE_EXP_SIGN,STATE_EXP_NUMBER,STATE_END};enum CharType {CHAR_NUMBER,CHAR_EXP,CHAR_POINT,CHAR_SIGN,CHAR_SPACE,CHAR_ILLEGAL};CharType toCharType(char ch) {if (ch >= '0' && ch <= '9') {return CHAR_NUMBER;} else if (ch == 'e' || ch == 'E') {return CHAR_EXP;} else if (ch == '.') {return CHAR_POINT;} else if (ch == '+' || ch == '-') {return CHAR_SIGN;} else if (ch == ' ') {return CHAR_SPACE;} else {return CHAR_ILLEGAL;}}
};
遍历
小天才才的题解
class Solution {
public:bool isNumber(string s) {//1. 遍历 找到所有合法情况int i = 0, j = s.size() - 1;//找到字符串中第一个不为空的位置for(; i<s.size(); i++){if(s[i] != ' ') break;}//从末尾找到字符串最后一个不为空的位置for(; j>=0; j--){if(s[j] != ' ') break;}//判断是否为数值,以及是否有小数点和e/Ebool numFlag = false;bool dotFlag = false;bool eFlag = false;for(int k=i; k<=j; k++){//判断是否为数字//if(isdigit(s[k])) numFlag=true;if(s[k] >= '0' && s[k] <= '9') numFlag = true;//判断是否为小数点,并且之前是否出现过小数点和e/Eelse if(s[k]=='.' && !dotFlag && !eFlag) dotFlag = true;//是小数点 且之前没有出现过小数点和e/E//判断是否为e/E,并且之前是否出现过e/E和数字else if((s[k]=='e' || s[k]=='E') && !eFlag && numFlag)//是e/E 之前没有出现过e/E 且e/E 前后是数字{eFlag = true;//因为e/E的前后必须都是数字,所以如果找到了e/E就把num_flag设为false,//遇到下一个数字再设为true,避免出现12e的情况numFlag = false;}//判断是否为+-,并且符号是否在数值的首位,或者前一位是e/Eelse if((s[k]=='+' || s[k]=='-') && (k==i || s[k-1]=='e' || s[k-1]=='E')) continue;//在数值的首位或者前一位是e/Eelse return false;//其他均为非法情况,输出false}return numFlag;//肯定有数字}
};
4. JZ75 字符流中第一个不重复的字符
class Solution
{
public://Insert one char from stringstreamvoid Insert(char ch) {v.push_back(ch);result[ch]++;//统计次数}//return the first appearence once char in current stringstreamchar FirstAppearingOnce() {for(int i=0; i<v.size(); i++){if(result[v[i]] == 1) return v[i];}return '#';}vector<char> v;unordered_map<char, int> result;
};
5. JZ23 链表中环的入口结点
快慢指针
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead) {if(pHead == nullptr || pHead->next == nullptr) return nullptr;ListNode* fast = pHead, *slow = pHead;//写法1while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(fast == slow)//第一次相遇{slow = pHead;while(slow != fast){slow = slow->next;fast = fast->next;}return fast;}}return nullptr;}
};
- 写法2
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead) {if(pHead == nullptr || pHead->next == nullptr) return nullptr;ListNode* fast = pHead, *slow = pHead;//写法2while(fast!=nullptr && fast->next!=nullptr){slow = slow->next;fast = fast->next->next;if(slow == fast) break;//不应该直接返回 要做判断 return fast->next;//cout << slow->val << fast->val<<endl;}// 若是快指针指向null,则不存在环if(fast==nullptr || fast->next==nullptr) return nullptr;//此时fast在环入口 让slow从头出发 同时走slow = pHead;//再次相遇就是环入口while (fast != slow) {fast = fast->next;slow = slow->next;}return fast;}
};
哈希表
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead) {if(pHead == nullptr || pHead->next == nullptr) return nullptr;//哈希表unordered_set<ListNode*> hashset;while (pHead) {if(hashset.count(pHead)) return pHead;hashset.insert(pHead);pHead = pHead->next;}return nullptr;}
};
6. JZ76 删除链表中重复的结点
快慢指针
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if (!pHead) return NULL;ListNode* slow = new ListNode(-1), *fast = new ListNode(-1), *dummy = new ListNode(-1);dummy->next = pHead;// 初始化两个指针slow = dummy;fast = dummy->next;while(fast){while(fast->next && fast->val == fast->next->val)// 遇到重复fast = fast->next;cout << "fast " << fast->val <<endl;cout << "slow " << slow->val <<endl;if(slow->next != fast)// 此时slow连接的还是fast的重复结点 需要删除结点{slow->next = fast->next;fast = fast->next;}else// 没有重复{fast = fast->next;slow = slow->next;}}return dummy->next;}
};
三指针
/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};
*/
class Solution {
public:ListNode* deleteDuplication(ListNode* pHead) {if (!pHead) return NULL;//三指针ListNode* pre = new ListNode(-1), *cur = new ListNode(-1), *dummyhead = new ListNode(-1);dummyhead->next = pHead;cur = pHead;//遍历链表 判断是否有重复pre = dummyhead;//虚拟链表尾while(cur){if(cur->next!=nullptr && cur->val == cur->next->val){while(cur->next!=nullptr && cur->val == cur->next->val)cur = cur->next;//此时没有重复了pre->next = cur->next;cur = cur->next;}else{cur = cur->next;pre = pre->next;}}return dummyhead->next;}
};
如果只保留一个重复结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->3->4->5
ListNode* deleteDuplication(ListNode* pHead)
{if (pHead == nullptr) return nullptr;ListNode* node = (ListNode*)malloc(sizeof(struct ListNode));node = pHead;while (node != nullptr) {if (node->next!=nullptr && node->val == node->next->val) {//这里千万要判断node->next也不为空才可以while (node->next != nullptr && node->val == node->next->val) {node->next = node->next->next;}}node = node->next;}return pHead;
}
- 写法2
ListNode* deleteDuplication(ListNode* pHead)
{if (pHead == nullptr || pHead->next == nullptr) return pHead;ListNode dummpyHead(0);dummpyHead.next = pHead;ListNode* pre = &dummpyHead;ListNode* cur = dummpyHead.next;while (cur != nullptr) {if (cur->next != nullptr && cur->val == cur->next->val) {while (cur->next != nullptr && cur->val == cur->next->val){cur = cur->next;}pre->next = cur;//删除重复结点pre = pre->next;cur = cur->next;}else {pre = pre->next;cur = cur->next;}}return dummpyHead->next;
}
7. JZ8 二叉树的下一个结点
数组保存结点
中序遍历,保存节点在数组中,再匹配目标节点
/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(pNode == nullptr) return nullptr;vector<TreeLinkNode*> v;//1.获取根节点TreeLinkNode* root = pNode;while(root->next != nullptr) root = root->next;//2.保存节点inOrder(root, v);//3.匹配目标节点for(int i=0; i<v.size(); i++){if(pNode == v[i]) return v[i+1];}return nullptr;}void inOrder(TreeLinkNode* root, vector<TreeLinkNode*>& v){if(root == nullptr) return;if(root->left) inOrder(root->left, v);v.push_back(root);if(root->right) inOrder(root->right, v);}
};
直接查找 分类讨论
默认当前节点作为根节点,那么中序遍历的下一个节点应该是其右子节点,如果
有右子树
有左子树,中序遍历的下一个节点
- 写法1
/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(pNode == nullptr) return nullptr;//分类// 如果有右子树TreeLinkNode* cur = nullptr;if(pNode->right != nullptr){pNode = pNode->right;// 一直找到右子树的最左下的结点为返回值while(pNode->left != nullptr) pNode = pNode->left;return pNode;}//如果有父节点 先看有没左子节点 有就返回;没有,说明当前节点是右叶子节点 只有右子节点 一直往上找父节点while(pNode->next != nullptr){cur = pNode->next;//当前结点的父节点if(cur->left == pNode) return cur;//无右子树 直到当前结点是其父节点的左子结点 返回pNode = pNode->next;}return nullptr;}
};
- 写法2
/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { }
};
*/
#include <unistd.h>
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(pNode == nullptr) return nullptr;//分类 写法2TreeLinkNode* node = nullptr;if(pNode->right != nullptr)//如果当前节点有右子树,则右子树最左边的那个节点就是{node = pNode->right;while(node->left != nullptr) node = node->left;return node;}node = pNode;while(node->next != nullptr && node == node->next->right)//当前节点有右子树{node = node->next;//找到当前节点是其父亲节点的左孩子的那个节点,然后返回其父亲节点 相当于一直往上找父节点}return node->next;//如果当前节点没有右子树 有左子树 返回当前节点的父节点}
};
- 写法3
/*
struct TreeLinkNode {int val;struct TreeLinkNode *left;struct TreeLinkNode *right;struct TreeLinkNode *next;TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {}
};
*/
#include <unistd.h>
class Solution {
public:TreeLinkNode* GetNext(TreeLinkNode* pNode) {if(pNode == nullptr) return nullptr;//分类 写法3TreeLinkNode* cur = nullptr;if(pNode->right)// 如果有右子树 一直找到右子树的最左下的结点为返回值{cur = pNode->right;while(cur->left != nullptr) cur = cur->left;return cur;}// 如果无右子树 且当前结点是其父节点的左子结点if(pNode->next != nullptr && pNode == pNode->next->left)return pNode->next;// 返回当前结点的父节点// 如果无右子树 且当前结点是其父节点的右子节点if(pNode->next != nullptr){cur = pNode->next;// 沿着左上一直爬树,爬到当前结点是其父节点的左自己结点为止while(cur->next != nullptr && cur == cur->next->right) cur = cur->next;return cur->next;// 返回当前结点的父节点}return nullptr;}
};
8. JZ28 对称的二叉树
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {
public:bool isSymmetrical(TreeNode* pRoot) {if(pRoot == nullptr) return true;return dfs(pRoot->left, pRoot->right);}bool dfs(TreeNode* node1, TreeNode* node2){if(node1 == nullptr && node2 == nullptr) return true;if(node1 == nullptr || node2 == nullptr) return false;if(node1->val != node2->val) return false;return dfs(node1->left, node2->right) && dfs(node1->right, node2->left);}
};
9. JZ77 按之字形顺序打印二叉树
栈实现
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {
public:vector<vector<int> > Print(TreeNode* pRoot) {vector<vector<int>> result;if(pRoot == nullptr) return result;stack<TreeNode*> st1;//保存从右向左节点stack<TreeNode*> st2;//保存从左向右节点st1.push(pRoot);while(!st1.empty() || !st2.empty()){vector<int> temp;TreeNode* cur;if(!st1.empty()){while(!st1.empty()){cur = st1.top();//访问st1节点后 从左向右存入st2temp.push_back(cur->val);//当前层的节点if(cur->left) st2.push(cur->left);if(cur->right) st2.push(cur->right);st1.pop();}result.push_back(temp);}temp.clear();if(!st2.empty()) {while (!st2.empty()) {cur = st2.top();temp.push_back(cur->val);if(cur->right) st1.push(cur->right);if(cur->left) st1.push(cur->left);st2.pop();}result.push_back(temp);}}return result;}
};
队列实现
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
#include <vector>
class Solution {
public:vector<vector<int> > Print(TreeNode* pRoot) {vector<vector<int>> result;if(pRoot == nullptr) return result;//队列实现queue<TreeNode*> que;que.push(pRoot);int level = 0, size = 0;//TreeNode* cur = nullptr;while(!que.empty()){vector<int> temp;//存储每一行结果size = que.size();// 当前队列长度 否则后面会更新for(int i=0; i<size; i++){TreeNode* cur = que.front();que.pop();if(cur == nullptr) continue; // 空元素跳过que.push(cur->left); // 左孩子入队列que.push(cur->right); // 右孩子入队列//第一层从左向右 level从0开始 level为偶数 左到右;下一层从右向左 level为奇数 右到左if(level % 2 == 0) temp.push_back(cur->val);// 从左至右打印else temp.insert(temp.begin(), cur->val);// 从右至左打印}level++;if(!temp.empty()) result.push_back(temp);}return result;}
};
10. JZ78 把二叉树打印成多行
队列+迭代,和上面那道题有点像,简单一点
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {
public:vector<vector<int> > Print(TreeNode* pRoot) {vector<vector<int>> result;if(pRoot == nullptr) return result;//队列queue<TreeNode*> que;que.push(pRoot);vector<int> v;TreeNode* cur;int size = 0;while(!que.empty()){v.clear();size = que.size();for(int i=0; i<size; i++){cur = que.front();que.pop();v.push_back(cur->val);if(cur->left) que.push(cur->left);if(cur->right) que.push(cur->right);}result.push_back(v);}return result;}
};
相关文章:

day9 10-牛客67道剑指offer-JZ66、19、20、75、23、76、8、28、77、78
文章目录 1. JZ66 构建乘积数组暴力解法双向遍历 2. JZ19 正则表达式匹配3. JZ20 表示数值的字符串有限状态机遍历 4. JZ75 字符流中第一个不重复的字符5. JZ23 链表中环的入口结点快慢指针哈希表 6. JZ76 删除链表中重复的结点快慢指针三指针如果只保留一个重复结点 7. JZ8 二…...

气体检测仪语音报警芯片,可自行烧录的音频芯片,WT588F02B-8S
近年来,安全问题备受关注,特别是涉及气体泄漏的危险场景。 为了进一步增强气体检测仪的安全功能,市面上便研发出了一款有害气体报警器,并采用WT588F02B-8S语音提示芯片为元器件,为产品赋予更多声音,更多警示…...
gdb 调试汇编
starti 从第一条指令开始执行并停止. nexti 执行完当前指令; 当前指令可能是call一个函数, 但是仍然下一条指令才停止; stepi 下一条指令, 如果跳转也跟着跳转; 查看寄存器值 info registers 查看通用寄存器 info registers {register_name ...}指定寄存器的值 info reg…...

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制
WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 之前实现iOS端调用ossrs音视频通话,可以查看:https://blog.csdn.net/gloryFlo…...
深入理解与运用Android Jetpack ViewModel
在Android开发中,数据与界面的分离一直是一项重要的挑战。为了解决这个问题,Google推出了Android Jetpack组件之一的ViewModel。ViewModel是一种用于管理UI相关数据的架构组件,它能够帮助开发者实现优雅的数据驱动和生命周期管理。本文将深入…...

【数据库】P0 创建数据库环境 MySQL + DataGrip
创建数据库环境 下载安装 MySQL下载安装 DataGrip 下载安装 MySQL Windows版本_MySQL 下载地址: https://dev.mysql.com/downloads/mysql/ 下载后依照默认顺序安装即可,本博文将讲述简约安装步骤; 如需详细安装步骤可见:https:/…...

js设置css变量控制页面一行展示指定个数的元素
前置知识: CSS变量之var()函数的应用——动态修改样式 & root的使用 flex相关知识 场景: 动态设置给父元素内子元素设置每行排列几个 通过 document.body.style.setProperty(--itemNum, 5)设置样式变量,然后通过给父元素设置display: f…...

4.0 Spring Boot入门
1. Spring Boot概述 Spring Boot介绍 Spring Boot是Pivotal团队在2014年推出的全新框架,主要用于简化Spring项目的开发过程,可以使用最少的配置快速创建Spring项目。 Spring Boot版本 2014年4月v1.0.0.RELEASE发布。 2.Spring Boot特性 约定优于配…...
[国产MCU]-BL602开发实例-I2C与总线设备地址扫描
I2C与总线设备扫描 文章目录 I2C与总线设备扫描1、I2C介绍2、I2C驱动API介绍3、I2C使用实例I2C (Inter-Intergrated Circuit)是一种串行通讯总线,使用多主从架构,用来连接低速外围装置。 每个器件都有一个唯一的地址识别,并且都可以作为一个发送器或接收器。每个连接到总线的…...

Python Opencv实践 - 图像平移
import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像平移 #cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) # M是仿射变换矩阵,对于平移来说M是一…...
易服客工作室:WordPress 6.3性能改进
随着WordPress 6.3发布,本文总结了该版本的性能改进。虽然WordPress 6.2显著提高了Core的加载时间性能,树立了很高的标准,但WordPress 6.3性能改进已经超越了这些结果:根据进行的性能基准测试,与WordPress 6.2相比&…...

LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...

山东布谷科技直播软件开发WebRTC技术:建立实时通信优质平台
在数字化的时代,实时通信成为了人们远程交流的主要方式,目前市场上也出现了很多带有实时通信交流的软件,实时通信符合人们现在的需求,所以在直播软件开发过程中,开发者也运用了实时通信技术为直播软件加入了实时通信的…...

Golang-语言源码级调试器 Delve
前言 Go 目前的调试器有如下几种: GDB 最早期的调试工具,现在用的很少。LLDB macOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve 专门为 Go 语言打造的调试工具,使用最为广泛。 本篇简单说明如何使用 Del…...

构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)
目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术,得到大量企业…...

【Vue3】keep-alive 缓存组件
当在 Vue.js 中使用 <keep-alive> 组件时,它将会缓存动态组件,而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 <keep-alive> 只能包含(或者说只能渲染)一个子组件…...
24成都信息工程大学809软件工程考研
1.渐增式与非渐增式各有何优、缺点?为什么通常采用渐增式? 非渐增式是将所有的模块一次连接起来,简单、易行、节省机时,但测试过程难于排错,发现错误也很难定位,测试效率低;渐增式是将模块一个…...

Filament for Android 编译搭建(基于Ubuntu20.04系统)
一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …...

【MySQL--->数据库操作】
文章目录 [TOC](文章目录) 一、操作语句1.增2.删3.改4.查5.备份 二、字符集与校验规则 一、操作语句 1.增 语句格式:create database [if no exists]数据库名[create_specification [,create_specification] …]; 中括号内是可选项,if no exists是指如果数据库不存在就创建,存…...

PhotoShop2023 Beta AI版安装教程
从 Photoshop 开始,惊艳随之而来 从社交媒体贴子到修饰相片,设计横幅到精美网站,日常影像编辑到重新创造 – 无论什么创作,Photoshop 都可以让它变得更好。 Photoshop2023 Beta版本安装教程和软件下载 地址:点击…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
python数据结构和算法(1)
数据结构和算法简介 数据结构:存储和组织数据的方式,决定了数据的存储方式和访问方式。 算法:解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想,对于算法而言&a…...

可下载旧版app屏蔽更新的app市场
软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…...

2025-06-01-Hive 技术及应用介绍
Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力…...