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神题解

  1. 解题思路:
    在这里插入图片描述
    初始化
    在这里插入图片描述
    初始化首行
    在这里插入图片描述
    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神的题解了。

有限状态机

  1. 解题思路:
    本题使用有限状态自动机。根据字符类型和合法数值的特点,先定义状态,再画出状态转移图,最后编写代码即可。

  2. 字符类型:
    空格:「 」、数字:「 0—90—90—9 」、正负号:「 +−±+− 」、小数点:「 … 」、幂符号:「 eEeEeE 」。

  3. 状态定义:
    按照字符串从左到右的顺序,定义以下 9 种状态。

    • 0 开始的空格
    • 1 幂符号前的正负号
    • 2 小数点前的数字
    • 3 小数点、小数点后的数字
    • 4 当小数点前为空格时,小数点、小数点后的数字
    • 5 幂符号
    • 6 幂符号后的正负号
    • 7 幂符号后的数字
    • 8 结尾的空格
  4. 结束状态,合法的结束状态有 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;}
};

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

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

相关文章

gitblit-使用

1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”&#xff0c;然后点击图中“创建版本库” 填写名称和描述&#xff0c;注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…

使用IIS服务器部署Flask python Web项目

参考文章 ""D:\Program Files (x86)\Python310\python310.exe"|"D:\Program Files (x86)\Python310\lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor参考文章 请求路径填写*&#xff0c;模块选择FastCgiModule&…

一键部署 Umami 统计个人网站访问数据

谈到网站统计&#xff0c;大家第一时间想到的肯定是 Google Analytics。然而&#xff0c;我们都知道 Google Analytics 会收集所有用户的信息&#xff0c;对数据没有任何控制和隐私保护。 Google Analytics 收集的指标实在是太多了&#xff0c;有很多都是不必要的&#xff0c;…

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

pytest 编写规范

一、pytest 编写规范 1、介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b;2、支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b;3、能够…

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后&#xff0c;实现了水表数据的信息化&#xff0c;并且当水表终端需要技术更新时&#xff0c;通过网络方式来升级产品可以高效修复设备面临的问题&#xff0c;减少用户损失&#xff0c;降低维护成本&#xff0c;但同时也对有限的网络…

遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素

一、遍历集合List的五种方法 测试数据 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循环 普通for循环&#xff0c;通过索引遍历 for (int i 0; i < list.size(); i) {Syst…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

腾讯云轻量服务器和云服务器的CPU处理器有差别吗?

腾讯云轻量应用服务器和CVM云服务器的CPU处理器性能有差别吗&#xff1f;创建轻量应用服务器时不支持指定底层物理服务器的CPU型号&#xff0c;腾讯云将随机分配满足套餐规格的物理CPU型号&#xff0c;通常优先选择较新代次的CPU型号。而云服务器CVM的CPU处理器型号、主频都是有…

JAVA设计模式----原型设计模式

文章目录 一、简介二、实现方式三、原型模式的注意事项浅拷贝与深拷贝浅拷贝深拷贝一、简介 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Protot…

下载程序到西门子PLC

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲 下载西门子200PLC程序分以下两步&#xff1a; 一.编译程序 1. 如下图1-1所示&#xff0c;使用PPI电缆将PLC和电脑连接上&#xff0c;注意笔记本使用USB转PPI电缆&#xff0c;连接保证给PLC单独供…

Linux(进程间通信详解)

进程间通信&#xff0c;顾名思义&#xff0c;就是进程与进程之间互通信交流&#xff0c;OS保证了各进程之间相互独立&#xff0c;但这不意味着进程与进程之间就互相隔离开&#xff0c;在不少的情况下&#xff0c;进程之间需要相互配合共同完成某项6任务&#xff0c;这就要求各进…

怎样学会单片机

0、学单片机首先要明白&#xff0c;一个单片机啥也干不了&#xff0c;学单片机的目的是学习怎么用单片机驱动外部设备&#xff0c;比如数码管&#xff0c;电机&#xff0c;液晶屏等&#xff0c;这个需要外围电路的配合&#xff0c;所以学习单片机在这个层面上可以等同为学习单片…

JVM:运行时数据区域(白话文)

最近有时间在看一本<深入了解Java虚拟机>的书籍&#xff0c;这本书是一个中国人&#xff0c;名叫周志明的人写的。相比于其他翻译过来的技术书籍&#xff0c;这本书还是挺通俗易懂的。先前有和彬哥在聊&#xff0c;他说如果是自己一个人看的话会很枯燥&#xff0c;很难坚…

双端列表 —— Deque 接口概述,使用ArrayDeque实现队列和双端队列数据结构

Deque接口简介 Deque译为双端队列&#xff0c;在双向都能作为队列来使用&#xff0c;同时可用作栈。Deque接口的方法是对称成比例的。 Deque接口继承Queue接口&#xff0c;因此具有Queue&#xff0c;Collection&#xff0c;Iterable的方法属性。 双端队列的工作原理 在常规队…

前端架构师的能力要求:打造可靠、灵活和可扩展的Web应用

随着互联网技术迅猛发展&#xff0c;现代Web应用程序变得越来越复杂且功能强大。作为一名前端架构师&#xff0c;在这个快节奏且竞争激烈的环境中&#xff0c;你需要具备广泛而深入地技术知识&#xff0c;并且有能力设计、开发和维护高度可靠、灵活和可扩展性强的Web应用。 深入…

jvm里的内存溢出

目录 堆溢出 虚拟机栈和本地方法栈溢出&#xff08;栈溢出很少出现&#xff09; 方法区和运行时常量池溢出 本机内存直接溢出&#xff08;实际中很少出现、了解即可&#xff09; 堆溢出 堆溢出&#xff1a;最常见的是大list&#xff0c;list里面有很多元素 堆溢出该怎么解决…

ArcGIS入门操作手册

一.ArcGIS安装过程 参考本人博客&#xff1a;保姆级Arcgis安装图文安装教程_追忆苔上雪的博客-CSDN博客 二.ArcGIS植被指数计算 (1)使用工具&#xff1a;栅格计算器 打开软件&#xff0c;右侧搜索栅格计算器打开&#xff0c;要是搜索栏不小心叉掉找不到了&#xff0c;可以通…