【力扣】刷题+剑指offer第二版
文章目录
- 题目收藏
- 不含重复字符的最长子串
- 最长公共子串
- 剑指 Offer
- 剑指 Offer 05. 替换空格
- 剑指 Offer 03. 数组中重复的数字
- 剑指 Offer 04. 二维数组中的查找
- 剑指 Offer 09. 用两个栈实现队列
- 剑指 Offer 07. 重建二叉树
- 剑指 Offer 06. 从尾到头打印链表
- 剑指 Offer 11. 旋转数组的最小数字
- 剑指 Offer 12. 矩阵中的路径
- 剑指 Offer 27. 二叉树的镜像
- 剑指 Offer 28. 对称的二叉树
- 剑指 Offer 29. 顺时针打印矩阵
- 剑指 Offer 30. 包含min函数的栈
- 剑指 Offer 31. 栈的压入、弹出序列
- 剑指 Offer 32 - I. 从上到下打印二叉树
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
- 剑指 Offer 34. 二叉树中和为某一值的路径
- 剑指 Offer 15. 二进制中1的个数
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
- 22.链表中倒数第k个节点
- 剑指 Offer II 022. 链表中环的入口节点
- 剑指 Offer 24. 反转链表
- 剑指 Offer 25. 合并两个排序的链表
- 剑指 Offer 26. 树的子结构
- 剑指 Offer 39. 数组中出现次数超过一半的数字
- 剑指 Offer 42. 连续子数组的最大和
题目收藏
不含重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
滑动窗口:左边界l, 右边界i
, 右边界从0~len-1,用unordered_map记录字符上一次出现的位置,如果出现过就把左边界移动到max(l,字符上次出现的位置+1)
每次左边界移动,都是从含有一个重复的字符到不包含重复字符
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int> last_exist;int len=s.size();int l=0;int ans=0;for(int i=0;i<len;i++){if(last_exist.find(s[i])==last_exist.end()){last_exist[s[i]]=i;ans=max(ans,i-l+1);}else{l=max(l,last_exist[s[i]]+1);last_exist[s[i]]=i;ans=max(ans,i-l+1);}}return ans;}
};
最长公共子串
给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。
#include<bits/stdc++.h>using namespace std;const int N = 10010;
char s1[N],s2[N];
int res, f[N];
int main()
{scanf("%s %s", s1 , s2);int l = strlen(s1), r = strlen(s2);for (int i = 1; i <= l; i++ )//将s1的长度看作物品数量(对应01背包){for (int j = r; j>=1; j--)//s2的长度看作背包容量(对应01背包){if (s1[i-1] == s2[j-1] && s1[i-1] > '9' && s2[j-1] > '9')//将s2的每个字符看作物品(体积为1,价值为x,其中x只有满足条件(满足相等)才有价值1,否则为0,<既然都为0了,为啥还要放进背包呢?>){f[j] = f[j - 1] + 1;//背包的价值res = max(res, f[j]);//res记录每次的最大值}else f[j] = 0;//都不满足,即所有物品价值为0,所以背包总价值也为0}}printf("%d\n", res);return 0;
}
剑指 Offer
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
- c++字符串可以修改,因为
i
一定小于j
,所以可能原地修改 - 从后往前,先得出修改后的长度,时间复杂度 O ( n ) O(n) O(n)
class Solution { public:string replaceSpace(string s) {int n=s.size();int num=0;for(int i=0;i<n;i++)if(s[i]==' ') num++;s.resize(n + 2 * num);for(int i=n-1,j=n-1+num*2;i<j;){ //i,j>=0也可if(s[i]==' '){s[j]='0';s[j-1]='2';s[j-2]='%';j-=3;i--;}while(i>=0 && j>=0 && s[i]!=' ') {//这一直报错,因为当i--后可能变为负的s[j]=s[i];i--;j--;}}return s;} };
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
-
哈希表空间 O ( n ) O(n) O(n)
-
原地交换时间和哈希一样是 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)
class Solution { public:int findRepeatNumber(vector<int>& nums) {int i=0;while(i<nums.size()){if(nums[i]!=i) {if(nums[nums[i]]!=nums[i])//因为都在[0,n)之间,不会越界swap(nums[i],nums[nums[i]]);else return nums[i];}else i++;}return -1;} };
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
基准是右上角或者左下角,这样才可以剔除一行或一列;左上角无法剔除,无法缩小查找范围
class Solution {
public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {int n=matrix.size();if(n==0) return false; int m=matrix[0].size();int r=0,c=m-1;while(r<n && c>=0){if(matrix[r][c]==target) return true;else if(target<matrix[r][c]) c--;else r++;}return false;}
};
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
class CQueue {//两个栈,一个出栈,一个入栈private Stack<Integer> stack1;private Stack<Integer> stack2;public CQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(!stack2.isEmpty()){return stack2.pop();}else{while(!stack1.isEmpty()){stack2.push(stack1.pop());}return stack2.isEmpty() ? -1 : stack2.pop();}}
}
剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
递推参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right
class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {this->preorder = preorder;for(int i = 0; i < inorder.size(); i++)dic[inorder[i]] = i;return recur(0, 0, inorder.size() - 1);}
private:vector<int> preorder;unordered_map<int, int> dic;TreeNode* recur(int root, int left, int right) { if(left > right) return nullptr; // 递归终止TreeNode* node = new TreeNode(preorder[root]); // 建立根节点int i = dic[preorder[root]]; // 划分根节点、左子树、右子树node->left = recur(root + 1, left, i - 1); // 开启左子树递归node->right = recur(root + i - left + 1, i + 1, right); // 开启右子树递归return node; // 回溯返回根节点}
};
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
从头遍历链表,入栈,再出栈。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:vector<int> reversePrint(ListNode* head) {stack<ListNode*> sk;vector<int> s;ListNode* pNode=head;while(pNode!=nullptr){sk.push(pNode);pNode=pNode->next;}while(!sk.empty()){pNode=sk.top();s.push_back(pNode->val);sk.pop();}return s;}
};
剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。
输入:numbers = [3,4,5,1,2]
输出:1
输入:numbers = [2,2,2,0,1]
输出:0
class Solution {
public:int minArray(vector<int>& numbers) {//二分int n=numbers.size();int l=0,r=n-1;int mid=l;//初始化为l,当numbers直接递增时int ans=numbers[0];while(numbers[l]>=numbers[r]){if(l+1==r) {mid=r;break;}mid=(l+r)>>1;if(numbers[mid]==numbers[l] && numbers[mid]==numbers[r]){for(int i=0;i<n;i++)ans=min(ans,numbers[i]);return ans;}if(numbers[mid]>=numbers[l]) l=mid;else if(numbers[mid]<=numbers[r]) r=mid;}return numbers[mid];}
};
- 按照旋转规则,第一个元素应该大于等于最后一个元素,特例
[1,2,3]
,此时,不进while()
直接return numbers[mid]=numbers[0]
- 若中间元素位于前面的递增子数组,那么它应该大于等于第一个指针指向的元素—>将第一个指针移到mid
剑指 Offer 12. 矩阵中的路径
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
class Solution {
public:bool exist(vector<vector<char>>& board, string word) {rows = board.size();cols = board[0].size();for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {if(dfs(board, word, i, j, 0)) return true;}}return false;}
private:int rows, cols;bool dfs(vector<vector<char>>& board, string word, int i, int j, int k) {if(i >= rows || i < 0 || j >= cols || j < 0 || board[i][j] != word[k]) return false;if(k == word.size() - 1) return true;board[i][j] = '\0';//已经用过这个字符了bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) || dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);board[i][j] = word[k];//回溯到上一层,恢复现场return res;}
};
剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
class Solution {
public:TreeNode* mirrorTree(TreeNode* root) {if(root == nullptr) return nullptr;stack<TreeNode*> stack;stack.push(root);while (!stack.empty()){TreeNode* node = stack.top();stack.pop();if (node->left != nullptr) stack.push(node->left);if (node->right != nullptr) stack.push(node->right);TreeNode* tmp = node->left;node->left = node->right;node->right = tmp;}return root;}
};
class Solution {
public:TreeNode* mirrorTree(TreeNode* root) {if (root == nullptr) return nullptr;TreeNode* tmp = root->left;root->left = mirrorTree(root->right);root->right = mirrorTree(tmp);return root;}
};
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
bool isSymmetric(Treenode* root){if(root==NULL) return false;return check(root->left,root->right);
}
bool check(Treenode* u, Treenode* v){if(u==NULL && v==NULL) return true;if(u==NULL || v==NULL || u->val!=v->val) return false;return check(u.left, v.right) && check(u.right, v.left);
}
class Solution {
public:bool check(TreeNode *u, TreeNode *v) {queue <TreeNode*> q;q.push(u); q.push(v);while (!q.empty()) {u = q.front(); q.pop();v = q.front(); q.pop();if (!u && !v) continue;if ((!u || !v) || (u->val != v->val)) return false;q.push(u->left); q.push(v->right);q.push(u->right); q.push(v->left);}return true;}bool isSymmetric(TreeNode* root) {return check(root, root);}
};
剑指 Offer 29. 顺时针打印矩阵
观察发现可以一圈一圈地输出,每圈的左上角可以表示成(start,start)
,循环继续的条件是n>start*2 && m>start*2
,每圈可以分为从左到右,从上到下。。四步,每步打印的范围是start~m-1-start
。。但是有的圈并不总是由这四步组成
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;int n=matrix.size();if(n==0) return {};int m=matrix[0].size();int start=0;while(n>start*2 && m>start*2){int endX=m-1-start;int endY=n-1-start;for(int i=start;i<=endX;i++) res.push_back(matrix[start][i]);for(int i=start+1;i<=endY;i++) res.push_back(matrix[i][endX]);if(start<endY) for(int i=endX-1;i>=start;i--) res.push_back(matrix[endY][i]);if(start<endX) for(int i=endY-1;i>start;i--) res.push_back(matrix[i][start]);start++;}return res;}
};
剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
借助一个辅助栈,其包含的是一个非递增序列–>如果新入栈的元素大于之前的最小值,仍然往辅助栈中压入该最小值,否则压入新入栈的元素
class MinStack {stack<int> x_stack;stack<int> min_stack;
public:MinStack() {min_stack.push(INT_MAX);}void push(int x) {x_stack.push(x);min_stack.push(::min(min_stack.top(), x));}void pop() {x_stack.pop();min_stack.pop();}int top() {return x_stack.top();}int min() {return min_stack.top();}
};
剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
借助一个栈来模拟,先按照压入顺序入栈,如果弹出序列的j在栈顶,就弹出;否则,继续压入…
class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> s;int n=pushed.size();for(int i=0,j=0;i<n;i++){s.push(pushed[i]);while(j<n &&!s.empty()&& popped[j]==s.top()) {s.pop();j++;}}if(s.empty()) return true;else return false;}
};
剑指 Offer 32 - I. 从上到下打印二叉树
二叉树的层序遍历/BFS
class Solution {
public:vector<int> levelOrder(TreeNode* root) {if(root==NULL) return {};vector<int> res;queue<TreeNode*> q;q.push(root);while(!q.empty()){auto t=q.front();res.push_back(t->val);q.pop();if(t->left) q.push(t->left);if(t->right) q.push(t->right);}return res;}
};
剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
因为每次在队列中的都属于同一层。所以,循环q.size()
次,对每个结点的处理不变。
vector<vector<int>> levelOrder(TreeNode* root) {if(root==NULL) return {};queue<TreeNode*> q;q.push(root);vector<vector<int>> ans;while(!q.empty()){vector<int> res;int cnt=q.size();for(int i=0;i<cnt;i++){auto t=q.front();q.pop();if(t->left) q.push(t->left);if(t->right) q.push(t->right);res.push_back(t->val); }ans.push_back(res); }return ans;}
剑指 Offer 33. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
输入: [1,6,3,2,5]
输出: false输入: [1,3,2,6,5]
输出: true
class Solution {
public:bool verifyPostorder(vector<int>& postorder) {return verify(postorder,0,postorder.size()-1);}bool verify(vector<int>& postorder,int left,int right){if(left>=right) return true;int root=postorder[right];int i=left;while(i<=right && postorder[i]<root) i++;int j=i;while(j<=right && postorder[j]>root) j++;//必须是递增的,所哟从i之后的都要大于rootreturn j==right && verify(postorder,left,i-1)&&verify(postorder,i,right-1);}
};
剑指 Offer 34. 二叉树中和为某一值的路径
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
class Solution {
public:vector<vector<int>> ans;vector<int> path;void dfs(TreeNode* root, int target){if(root==nullptr) return;target-=root->val;path.push_back(root->val);if(root->left==nullptr && root->right==nullptr && target==0) ans.push_back(path);dfs(root->left,target);dfs(root->right,target);//回溯时的恢复path.pop_back();}vector<vector<int>> pathSum(TreeNode* root, int target) { dfs(root,target);return ans;}
};
剑指 Offer 15. 二进制中1的个数
可能输入负数,如0x80000000。负数右移:10001010>>3=11110001
- 循环的次数等于整数二进制的位数
int NumberOf1(int n){int count=0;unsigned int flag=1;while(flag){if(n&flag) count++;flag=flag<<1;}return count; }
- 二进制数字n中1的个数
n&(n-1)
把n最右边的1变为0int NumberOf1(int n){int count=0;while(n){count++;n=n&(n-1);}return count; }
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
class Solution {
public:vector<int> exchange(vector<int>& nums){int i = 0, j = nums.size() - 1;while (i < j){while(i < j && (nums[i] & 1) == 1) i++;while(i < j && (nums[j] & 1) == 0) j--;swap(nums[i], nums[j]);}return nums;}
};
(nums[i] & 1) == 1)
这里是一个判断数字属于数组的前半部分还是后半部分的函数。
22.链表中倒数第k个节点
只遍历链表一次:
思路:第一个指针从头节点开始走k-1步,第二个指针保持不动;从第k步开始,第二个指针也开始从头结点动(由于两个指针相差k-1,所以当第一个指针到末尾时,第二个指针刚好指向倒数第k个节点)
扩展1:求链表的中间结点。一个指针一次走一步,另一个一次走两步;当走得快的指针走到末尾时,走得慢的指针刚好在链表中间。(扩展2:若走得快的追上了走得慢的,说明链表中存在环;没有追上说明一定不存在)
剑指 Offer II 022. 链表中环的入口节点
给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。
第一轮相遇:
fast 走的步数是 slow 步数的 2 倍,即 f = 2 s f=2s f=2s
fast 比 slow 多走了 n 个环的长度,即 f = s + n b f=s+nb f=s+nb
–> f = 2 n b , s = n b f=2nb, s=nb f=2nb,s=nb
目前,slow 指针走过的步数为 nb 步。因此,我们只要想办法让 slow 再走 a 步停下来,就可以到环的入口
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *fast = head, *slow = head;while (true) {if (fast == nullptr || fast->next == nullptr) return nullptr;fast = fast->next->next;slow = slow->next;if (fast == slow) break;}fast = head;//fast走了a步->slow也走了a步while (slow != fast) {slow = slow->next;fast = fast->next;}return fast;//不能是head}
};
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* tmp=head;ListNode* pPrev=nullptr;ListNode* pReversedHead=nullptr;while(tmp!=nullptr){ListNode* pNext=tmp->next;//防止链表断裂,复制if(pNext==nullptr) pReversedHead=tmp;//最后一个结点就是反转后的头结点tmp->next=pPrev;pPrev=tmp;tmp=pNext;//注意这两句的顺序}return pReversedHead;}
};
剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* dump=new ListNode(0);ListNode* cur=dump;while(l1!=nullptr && l2!=nullptr){if(l1->val == l2->val || l1->val > l2->val) {cur->next=l2;l2=l2->next;}else {cur->next=l1;l1=l1->next;}cur=cur->next;}if(l1==nullptr) cur->next=l2;else cur->next=l1;return dump->next;}
};
递归:
class Solution {
public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1==nullptr) return l2;if(l2==nullptr) return l1;ListNode* pMergeHead=nullptr;if(l1->val < l2->val){pMergeHead=l1;pMergeHead->next=mergeTwoLists(l1->next,l2);}else{pMergeHead=l2;pMergeHead->next=mergeTwoLists(l1,l2->next);}return pMergeHead;}
};
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
class Solution {
public:bool isSubStructure(TreeNode* A, TreeNode* B) {bool result=false;if(A!=nullptr && B!=nullptr){//找到节点值相同的点,然后判断其左右子树是否相同if(A->val==B->val) result=doesTree1HasTree2(A,B);//没找到节点值相同的点,继续找(递归看其左右子树)if(!result) result=isSubStructure(A->left,B);if(!result) result=isSubStructure(A->right,B);}return result;}bool doesTree1HasTree2(TreeNode* A,TreeNode* B){if(B==nullptr) return true;//注意这两句的顺序if(A==nullptr) return false;if(A->val!=B->val) return false;return doesTree1HasTree2(A->left,B->left) && doesTree1HasTree2(A->right,B->right);}
};
剑指 Offer 39. 数组中出现次数超过一半的数字
摩尔投票法: 核心理念为 票数正负抵消。此方法时间和空间复杂度分别为 O ( N ) O(N) O(N) 和 O ( 1 ) O(1) O(1)
剑指 Offer 42. 连续子数组的最大和
class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();int res=nums[0],before=nums[0],tmp;for(int i=1;i<n;i++){if(before<=0) tmp=nums[i];else tmp=before+nums[i];before=tmp;//优化成before=max(),res=max(before)res=max(res,tmp);}return res;}
};
相关文章:

【力扣】刷题+剑指offer第二版
文章目录 题目收藏不含重复字符的最长子串最长公共子串 剑指 Offer剑指 Offer 05. 替换空格剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 09. 用两个栈实现队列剑指 Offer 07. 重建二叉树剑指 Offer 06. 从尾到头打印链表剑指 Offer 11. 旋转数组…...

QueryStorm Crack
QueryStorm Crack 应用程序现在可以指定“minRuntimeVersion”。 添加了用于节流和API密钥管理的HTTP请求基础结构(请求/尝试/重试循环)。 改进了许可提示的处理(避免在多个单元格中评估许可功能时出现多个提示)。 已添加“IDialogServiceExt”接口,该接口允许应用程…...

网络安全与隐私保护:挑战与应对策略
一、引言 在互联网时代,个人隐私保护已经成为一项全球性的难题。尤其是在“裸奔”时代下,人们越来越难以避免个人隐私泄露的风险。网络安全与隐私保护已经成为了人们关注的焦点。保护网络隐私已经成为了每个人最基本的权利和义务。 二、网络安全与隐私…...

不同应用场景瑞芯微RK3568主板方案定制
随着物联网和智能设备的迅猛发展,瑞芯微RK3568主板方案作为一种高性能的系统System-on-a-chip(SoC),已经成为嵌入式系统、智能家居设备和工业自动化设备等应用场景的首选方案。定制瑞芯微RK3568主板方案可以满足不同应用场景的需求…...

公司数字化转型,如何选择高效的知识管理工具?
随着企业数字化转型的加速,知识管理工具的重要性也日益凸显。好的知识管理工具可以帮助企业提高工作效率、降低成本、提高创新能力和竞争力。但是,市场上的知识管理工具繁多,如何选择高效的知识管理工具成为了企业面临的一大难题。本文将从以…...

银行从业法律法规(初级)-多选
目录 前言一、巴塞尔相关1-1 第一版巴塞尔1-2 第二版巴塞尔1-3 第三版巴塞尔 二、银行2-0 银行相关2-1 中国人民银行2-2 国家开发银行2-3 政策性银行2-4 银保监会2-5 银监会 三、合规&风险3-1合规3-2 风险3-3 资产负债管理 四、货币&财政4-1 货币4-2 利率 五、存款贷款…...

Maven 依赖管理 学习
目录 Maven 依赖管理 可传递性依赖发现 依赖范围 依赖管理 Maven 自动化部署 问题描述 解决方案 修改项目的 pom.xml Maven Release 插件 Maven Web 应用 创建 Web 应用 构建 Web 应用 部署 Web 应用 Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处…...

分享105个NET源码ASP源码,总有一款适合您
分享105个NET源码,总有一款适合您 源码下载链接:https://pan.baidu.com/s/1zFMIHX6juXdR2CaHMEr5mQ?pwdf5hz 提取码:f5hz 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后…...

Web缓存利用分析(三)
导语:前一篇文章介绍了Server Cache Poisoning在实际应用场景下,产生DOS攻击的利用方式。本篇文章则介绍Web Cache Deception在真实场景下的应用方式和测试情况。 前言 前一篇文章介绍了Server Cache Poisoning在实际应用场景下,产生DOS攻击…...

Git合并冲突的根本原因和解决方法
假如您现在正在参与一个团队项目,并取得了实质性的进展。然而,当你准备提交代码的时候,发现团队中的某个人也更改了同一个文件,并且先你一步提交了——您现在遇到了代码冲突问题。而且需要花时间去解决自己的更改与别人的更改之间…...

从C语言到C++⑨(第三章_CC++内存管理)详解new和delete+面试题笔试题
目录 1. C语言动态内存管理 1.1 C/C内存分布 1.2 C语言中动态内存管理的方式 2. C动态内存管理方式 2.1 new/delete操作内置类型 2.2 初始化new数组的问题 2.3 new 和 delete 操作自定义类型 3. operator new与operator delete函数详解 3.1 operator new与operator de…...

阿里云服务器安装宝塔Linux面板教程图解
使用阿里云服务器安装宝塔面板教程,阿里云服务器网以CentOS操作系统为例,安装宝塔Linux面板,先远程连接到云服务器,然后执行宝塔面板安装命令,系统会自动安装宝塔面板,安装完成后会返回面板地址、账号和密码…...

ORA-01555 ORA-22924 快照过旧问题处理
ORA-01555 ORA-22924 快照过旧问题处理 问题描述 使用数据泵导出数据,或在业务功能查询某个表时,可能出现 ORA-01555 ORA-22924 快照过旧的错误: ORA-01555: snapshot too old: rollback segment number with name "" too small…...

Win11系统更新后网络速度变的很慢怎么办?
Win11系统更新后网络速度变的很慢怎么办?有用户将自己的电脑系统升级到了Win11之后,出现了一些问题。电脑在使用中出现了网络速度变慢的情况。而且其它的设备在连接网络后速度是正常的,那么这个问题要怎么解决?来看看以下的方法分…...

了解 XML结构(一)
文章目录 1 XML定义2 了解XML结构3 XML节点类型4 加载读取XML5 小结 1 XML定义 XML是一种可扩展标记语言(Extensible Markup Language, XML),可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 …...

Vue简单语法记录
指令 v-show:展示和隐藏 如图片的展示和隐藏 (底层是其实已经创建了 加了个css属性,display none)v-if:创建和删除 创建和删除,删除就真的没了v-for: 遍历指令 v-for"item in list&…...

matplotlib的安装和使用教程:中文字体及语言参数设置
matplotlib是一个常用的数据可视化库,广泛应用于科学研究、工程设计、金融分析等领域。由于其强大的功能和易用性,matplotlib已经成为了广大科研工作者和数据分析师的必备工具之一。本文将重点介绍matplotlib的安装和允许中文及几种字体的方法。 一、mat…...

mysql深分页
第一种:主键自增id情况: 未改: select * from wx_product_category_info where category_name_cn#{categoryNameCn} and category_type#{categoryType} order by id asclimit #{pageNum}, #{pageSize};在普通的limit条件下,如果…...

【JavaScript由浅入深】常用的正则表达式
【JavaScript由浅入深】常用的正则表达式 文章目录 【JavaScript由浅入深】常用的正则表达式写在前面一、认识正则表达式1.1 正则表达式的概念 二、正则表达式的使用2.1 使用构造函数创建正则表达式2.2 使用字面量创建正则表达式2.3 补充 三、正则表达式常见规则3.1 字符类3.2 …...

QT常用类型字节数组QByteArray及其基本使用
目录 概述特点常见函数QByteArray::append:QByteArray::insert:QByteArray::replace:QByteArray::remove:QByteArray::toHex:QByteArray::fromHex:QByteArray::toBase64:QByteArray::fromBase64…...

APP 兼容性测试是什么?8年测试老鸟告诉你
1、APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑:操作系统、厂…...

Golang每日一练(leetDay0061) 表列序号、阶乘后的零
目录 171. Excel 表列序号 Excel Sheet Column Number 🌟 172. 阶乘后的零 Factorial Trailing Zeroes 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练…...

深度解析C++异常处理机制:最佳实践、性能分析和挑战
C 基础知识 八 异常处理 下篇 一、异常处理实践1 编写高质量代码中的异常处理1.1 只在必要时才使用异常1.2 尽量减小异常的范围1.3 不要隐藏异常1.4 不要在析构函数中抛出异常1.5 使用 RAII 技术来管理资源 2 维护异常类2.1 按照异常类型的功能来定义异常类2.2 继承现有的异常类…...

【Spring事务】Spring事务事件控制,解决业务异步操作
使用背景 在业务中,经常会有这样的需求,在数据库事务提交之后,发送异步消息或者进行其他的事务操作。 例如当用户注册成功之后,发送激活码,如果用户注册后就执行发送激活码,但是在用户保存时出现提交事务…...

Java 中的注释有哪些?
在 Java 中,有三种注释方式:单行注释、多行注释和文档注释。注释是程序中的一种重要的辅助性说明文字,可以增加程序的可读性和可维护性,方便其他程序员阅读和理解代码。 单行注释 单行注释是指以“//”开头的注释,注释…...

yolov4
1 V4版本概述 集各种优秀方案于一身,嫁接了众多主流的目标识别方面的情况。 V4 贡献 3. 数据增强策略分析 BOF Bag of freebies(BOF) Mosiac 数据增强 Mixup 比如将狗和猫的两张图片混合,一半猫,一半狗。 label 也变成 Dog 0.5 , Cat 0…...

金融学第二版笔记第一章1.1
第1部分 金融和金融体系 第一章金融学 1.1 一、 对金融学进行界定 1.金融 金融是货币流通、信用活动及与之相关的经济行为的总称。 简言之,就是货币资金的融通。一般是指以银行、证券市场等为中心的货币流通和信用调节活动,包括货币的发行和流通、存…...

[架构之路-193]-《软考-系统分析师》-2-应用数学 - 项目周期与关键路径(PERT图、甘特图、单代号网络图、双代号网络图)
1. 关键概念 1.1 关键路径 关键路径通常(但并非总是)是决定项目工期的进度活动序列。它是项目中最长的路径,即使很小浮动也可能直接影响整个项目的最早完成时间。关键路径的工期决定了整个项目的工期,任何关键路径上的终端元素…...

滋灌中小企业,分销伙伴和华为来做“送水人”
最近有个段子:第一批靠生成式AI赚大钱的人,既不是研发人员,也不是国内大厂,而是卖课的。 大家笑谈,每一轮新技术的掘金之路,最先致富的都是送水、卖铲子的。 这其实隐藏了一个信息技术产业的普遍规律&#…...

面试华为测试岗,收到offer后我却毫不犹豫拒绝了....
我大学学的是计算机专业,毕业的时候,对于找工作比较迷茫,也不知道当时怎么想的,一头就扎进了一家外包公司,一干就是2年。我想说的是,但凡有点机会,千万别去外包! 在深思熟虑过后&am…...