动态规划:两个数组的dp问题(C++)
动态规划:两个数组的dp问题
- 前言
- 两个数组的dp问题
- 1.最长公共子序列(中等)
- 2.不同的子序列(困难)
- 3.通配符匹配(困难)
- 4.正则表达式(困难)
- 5.交错字符串(中等)
- 6.两个字符串的最小ASCII删除和(中等)
- 7.最长重复子数组(中等)
前言
动态规划往期文章:
- 动态规划入门:斐波那契数列模型以及多状态
- 动态规划:路径和子数组问题
- 动态规划:子序列问题
- 动态规划:回文串问题
两个数组的dp问题
1.最长公共子序列(中等)
链接:最长公共子序列
-
题目描述
-
做题步骤
-
状态表示
对于两个数组的dp,采用一维dp是没有办法清晰的表示状态的,故对于两个数组的dp我们通常采用二维数组。
故定义状态表示为dp[i] [j]:s1的[0,i]区间和s2的[0,j]区间之间的最长公共子序列。 -
状态转移方程
对s1的[0,i]区间和s2的[0,j]区间,我们分情况讨论:
(1)s1[i] == s2[j],我们只需要知道s1的[0,i - 1]区间和s2的[0,j - 1]区间之间的最长公共子序列,然后加一即可,即dp[i] [j] = dp[i - 1] [j - 1] + 1。(比如s1 = "abc"和s2 = “akc”,就是"ab"和"ak"的最长公共子序列加1)
(2)s1[i] != s2[j],这个这时最长公共子序列⼀定不会同时以s1[i]和s2[j]结尾。
①有可能以s2[j]结尾,去s1的 [0, i - 1]以及s2的 [0, j] 区间内找:此时最大长度为dp[i - 1] [j]。(比如s1 = “ack”,s2 = “bc”)
②有可能以s1[i]结尾,去s1的[0, i]以及s2的 [0, j - 1] 区间内找:此时最大长度为dp[i] [j - 1]。(比如s1 = “ac”,s2 = “cb”)
③也有可能两者都不是结尾,但这个情况是包括在前两个情况中的,一定小于等于前两者。(比如s1 = “acd”,s2 = “aca”)
故对于(2)情况,dp[i] [j] = max(dp[i - 1] [j], dp[i] [j - 1])。 -
初始化
-
填表顺序
参照上面的图,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution {
public:int longestCommonSubsequence(string s1, string s2) {int m = s1.size(), n = s2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));//处理下标映射s1 = " " + s1, s2 = " " + s2;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){ if(s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1] + 1; elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); } return dp[m][n];}
};
2.不同的子序列(困难)
链接:不同的子序列
-
题目描述
-
做题步骤
-
状态表示
这个题目虽然标的是困难,但是有前面的做题经验其实还好。
对这种问题,我们采用二维表,定义状态表示为dp[i] [j]:t的[0, j]区间在s的[0, i]区间出现的方案个数。 -
状态转移方程
对s的[0,i]区间和t的[0,j]区间,我们分情况讨论:
(1)s[i] == t[j]:
①比如t = "rab"和s = “rabcb”,第一种同时选s[i]、t[j]为结尾,这个时候的方案数为t的[0, j - 1]区间在s的[0, i - 1]区间出现的方案数(ra在rabc中出现的次数),即dp[i - 1] [j - 1]。
②第二种是不同时选s[i]、t[j]为结尾,这个时候的方案数为t的[0, j]区间在s的[0, i - 1]区间出现的方案数(t = "rab"在s的"rabc"中出现的次数),即dp[i - 1] [j]。
两种都符合要求:故(1)情况dp[i] [j] = dp[i - 1] [j] + dp[i - 1] [j - 1]
(2)s[i] != t[j]:
这个时候只有一种选择,即(1)的②情况,故(2)情况dp[i] [j] = dp[i - 1] [j] 。 -
初始化
这个题目的初始化和上一题相似,多开一行一列,把多的一行一列当作空串。其中当t为空串时在s中一定有一种方案(s也拿一个空串出来),故初始化第一列为1。 -
填表顺序
填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s、t长度)。
- 代码实现
class Solution {
public:int numDistinct(string s, string t) {int m = s.size(), n = t.size();//这个题目中间填表的时候会溢出,而且溢的不是一点点//不过溢出的部分不影响结果,用uint即可vector<vector<unsigned int>> dp(m + 1, vector<unsigned int>(n + 1));s = " " + s, t = " " + t; //处理下标映射for(int i = 0; i < m; i++) dp[i][0] = 1;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] = dp[i - 1][j];if(s[i] == t[j]) //s[i] == t[j]会多一种选择dp[i][j] += dp[i - 1][j - 1]; }return dp[m][n];}
};
3.通配符匹配(困难)
链接:通配符匹配
-
题目描述
-
做题步骤
-
状态表示
依据前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:p的[0, j]区间能否匹配s的[0, i]区间。 -
状态转移方程
对s的[0,i]区间和p的[0,j]区间,我们分情况讨论:
(1)s[i] == p[j]或者p[j] == '?'时,dp[i] [j] = dp[i - 1] [j - 1],即只要p的[j - 1]区域能和s的[i - 1]区域匹配,p的[0, j]就可以和s的[0, i]匹配。(比如s = “abc”,p = “ab?”)
(2)p[j] == ’ * ’ 的情况,这个时候有三种可能使得p[0, j]和s[0, i]匹配:
①p的[0, j]可以和s的[0, i - 1]匹配,p[j] == ’ * ’ 在表示原来的字符串基础上加上s[i]即可,即dp[i - 1] [j]为真dp[i] [j]为真。(比如s = “abc”,p = “a*”,"ab"和"a*"是匹配的)
②p的[0, j - 1]可以和s的[0, i]匹配, ’ * ’ 这个时候匹配空串即可,即dp[i] [j - 1]为真dp[i] [j]为真。(比如s = “ab”,p = “ab*”)
③p[0, j - 1]匹配和s的[0, i - 1],p[j] == ’ * ’ 去替换s[i],但这种情况实际是可以被归于第一种情况的,如果s[0, i - 1]和p[0, j - 1]匹配,那么s[0, i - 1]和p[0 , j]也一定会匹配,这个时候 ’ * ’ 做空字符串,即dp[i - 1] [j - 1]为真 == dp[i - 1] [j]为真。
以上情况只要一个为真dp[i] [j]就为真。 -
初始化
和前面一样,为了避免越界以及方便初始化,我们引入空串的概念,多开一行和一列。
①其中两者都为空串可匹配,即dp[0] [0] = true。
②s为空串,p不为空串(第一行除去[0, 0])的时候如果p的[0, j]区间为连续的 ’ * ’ 也是可以匹配空串的,dp[0] [0……j] = true。([0, j]区间表示连续的 ’ * ’ )
③p为空串,s不为空串(第一列除去[0, 0]),这个时候不可能匹配,第一列除开[0][0]其它都初始化为false。 -
填表顺序
填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s、p长度)。
- 代码实现
class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();s = " " + s, p = " " + p; //处理下标映射//dp[i][j]:p的[0, j]区间能否匹配s的[0, i]区间vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = true; for(int j = 1; j <=n; j++) //初始化s为空串,p有连续'*'可匹配的情况{if(p[j] == '*')dp[0][j] = true;elsebreak; //出现非'*'直接结束循环,后面不可能匹配了}for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++){if(p[j] == '*')dp[i][j] = dp[i - 1][j] || dp[i][j - 1];else if(s[i] == p[j] || p[j] == '?')dp[i][j] = dp[i - 1][j - 1];}return dp[m][n];}
};
4.正则表达式(困难)
链接:正则表达式
-
题目描述
-
做题步骤
-
状态表示
有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:p的[0, j]区域能否匹配s的[0, i]区域。 -
状态转移方程
这个题目的重点:"a*"说明这个部分可以出现多次,也可以出现0次,即a表示空串,所以分析的时候应该把"字符 + "当作一个整体来考虑。
对s的[0,i]区间和p的[0,j]区间,我们分情况讨论:
(1)s[i] == p[j]或p[j] == ’ . ’ ,只需要p的[0, j - 1]和s的[0, i - 1]匹配即可,即dp[i - 1] [j - 1]为真dp[i] [j]就为真。(比如s = "abc"和p = “ab.”)
(2)p[j] == ’ * ’ 的情况,这个时候有三种可能使得p[0, j]和s[0, i]匹配:
①p[0, j - 2]和s[0, i]匹配,后面的"字符+"表示空串。即dp[i] [j - 2]为真dp[i] [j]就为真。(比如s = “abc”,p = “abcg*”,p后面的"g*"可以直接作空串)
②p[0, j]和s[0, i - 1]匹配,原本的"字符+"需要多表示一个字符。
但这里多表示的字符是固定的,也就是说必须满足p[j - 1] == s[i] 或 p[j - 1] == ’ . ’ ,这个多表示的字符才能符合要求。即满足前面条件dp[i - 1] [j]为真dp[i] [j]就为真。
(比如s = “abbb”,p = “ab*”,其中"ab*"是可以匹配"abb"的,刚好"b*"多表示一个’ b ’ 符合匹配要求。如果s = "abbc"就p就无法匹配s了)
以上情况只要一个为真dp[i] [j]就为真。 -
初始化
为了避免越界已经方便初始化,我们引入空串的概念,多开一行一列。
①其中两者都为空串可匹配,即dp[0] [0] = true。
②当s为空串,p不为空串(第一行除去[0, 0])的时候如果p为连续的"字符 + * + 字符 + * ……",让这些"字符+ *"全都作空串,是可以匹配s的。即dp[0] [j] = true(j = 2; j <= n; j += 2)。
③p为空串,s不为空串(第一列除去[0, 0]),这个时候不可能匹配,第一列除开[0] [0]其它都初始化为false。 -
填表顺序
填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s、p长度)。
- 代码实现
class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();//处理下标映射s = " " + s, p = " " + p;//dp[i][j]:p的[0,j]区域能否和s的[0,i]区域匹配vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = 1; //空串可以匹配空串for(int j = 2; j <= n; j += 2) //s为空串时p为连续的"字符 + *"是可以匹配的{if(p[j] == '*') dp[0][j] = true;elsebreak;}for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(p[j] == '*'){dp[i][j] = dp[i][j-2] || (p[j-1] == '.' || p[j-1] == s[i]) && dp[i-1][j];}else if(s[i] == p[j] || p[j] == '.'){dp[i][j] = dp[i - 1][j - 1];}}return dp[m][n];}
};
5.交错字符串(中等)
链接:交错字符串
-
题目描述
-
做题步骤
-
状态表示
有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:s1的[0, i]区间和s2的[0, j]区间能否交错组成s3的[0, i + j]区间。 -
状态转移方程
对s1的[0,i]区间和s2的[0,j]区间能否交错组成s3的[0, i + j]区间,我们分情况讨论:
(1)s1[i] == s3[i + j]。这个时候只要s1的[0, i - 1]区间和s2的[0, j]区间可以组成s3的[0,i + j - 1]区间即真,即dp[i] [j] = (s1[i] == s3[i + j] && dp[i - 1] [j])
(2)s2[j] == s3[i + j]。这个时候只要s1的[0, i]区间和s2的[0, j - 1]区间可以组成s3的[0,i + j - 1]区间即真,即dp[i] [j] = (s2[j] == s3[i + j] && dp[i] [j - 1])
以上情况只要一个为真dp[i] [j]就为真。 -
初始化
为了避免越界以及方便初始化,我们引入空串的概念,多开一行一列。
①其中s1和s2都为空串可以组成空串s3,即dp[0][0] = true。
②当s1为空串,s2不为空串(第一列除去[0, 0])的时候可以由s2单独组成s3,前提是相等。即dp[0] [j] = true([1, j]区间s2与s3相等)。
③当s2为空串,s1不为空串(第一行除去[0, 0])的时候可以由s1单独组成s3,前提是相等。即dp[i] [0] = true([1, i]区间s1与s3相等)。 -
填表顺序
填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution
{
public:bool isInterleave(string s1, string s2, string s3) {int m = s1.size(), n = s2.size();if(m + n != s3.size()) return false; //两者相加比s3长度小,一定没办法组成的s1 = " " + s1, s2 = " " + s2, s3 = " " + s3; //处理下标映射//dp[i][j]:s1的[1,i]区间和s2的[1,j]区间能否交错组成s3的[1,i+j]区间vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = true;for(int j = 1; j <= n; j++) // 初始化第⼀⾏,即s1为空,s2单独组成s3{if(s2[j] == s3[j]) dp[0][j] = true;else break;}for(int i = 1; i <= m; i++) // 初始化第⼀列,即s2为空,s1单独组成s3{if(s1[i] == s3[i]) dp[i][0] = true;else break;}for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)dp[i][j] = (s1[i] == s3[i + j] && dp[i - 1][j])|| (s2[j] == s3[i + j] && dp[i][j - 1]); return dp[m][n];}
};
6.两个字符串的最小ASCII删除和(中等)
链接:两个字符串的最小ASCII删除和
-
题目描述
-
做题步骤
-
状态表示
有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:s1的[0, i]区间和s2的[0, j]区间要达到相同的最小删除消耗。 -
状态转移方程
对s1的[0,i]区间和s2的[0,j]区间如何相同,我们分情况讨论:
(1)s1[i] == s2[j]时,只需要让s1的[1, i - 1]和s2[1, j - 1]相同,即dp[i] [j] = dp[i - 1] [j - 1]。
(2)s1[i] != s2[j]时,有两种选择:
①让s1的[1, i - 1]和s2的[1, j]相同,把多余的s1[i]删除,即dp[i] [j] = dp[i - 1] [j] + s1[i]。
②s1的[1, i]和s2的[1, j -1]相同,把多余的s2[j]删除,即dp[i] [j] = dp[i] [j - 1] + s2[j]。
取①②情况的最小值即可,即(2)情况dp[i][j] = min(dp[i] [j - 1] + s2[j], dp[i - 1] [j] + s1[i])。
这里提一下(1)情况的消耗是一定小于等于(2)的消耗,比如我一个短串和一个长串达到相等的消耗了x。现在我在短串后面加一些字符,想达到相等的话消耗一定会大于等于x。 -
初始化
为了避免越界以及方便初始化,我们引入空串的概念,多开一行一列。
①当s1和s2都为空串,消耗为0,即dp[0] [0] = 0。
②当s1为空串,s2不为空串(第一列除去[0, 0])的时候s2必须全部删除一直到为空串。即dp[0] [j] = dp[0] [j - 1] + s2[j] (j = 1; j <= n; j++)。
③当s2为空串,s1不为空串(第一行除去[0, 0])的时候s1必须全部删除一直到为空串。即dp[i] [0] = dp[i - 1] [0] + s1[i] (i = 1; i <= m; i++)。 -
填表顺序
填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。 -
返回值
依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution {
public:int minimumDeleteSum(string s1, string s2) {int m = s1.size(), n = s2.size();s1 = " " + s1, s2 = " " + s2; //处理下标映射//dp[i][j]:s1的[1,i]区间和s2的[1,j]区间要达到相同的最小删除消耗vector<vector<int>> dp(m + 1, vector<int>(n + 1));//s1为空串,s2要删除为空串的最小消耗for(int j = 1; j <= n; j++)dp[0][j] = dp[0][j - 1] + s2[j];//s2为空串,s1要删除到空串的最小消耗for(int i = 1; i <= m; i++)dp[i][0] = dp[i - 1][0] + s1[i];for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = min(dp[i][j - 1] + s2[j], dp[i - 1][j] + s1[i]);}return dp[m][n];}
};
7.最长重复子数组(中等)
链接:最长重复子数组
-
题目描述
-
做题步骤
-
状态表示
这个题不难,但是注意它是子数组而不是子序列,我们用前面的方式定义状态表示是会出错的,比如我定义状态表示为dp[i] [j]:n1的[0, i]区间与n2的[0, j]区间中的公共最长子数组长度。
拿n1 = [3, 1, 1]和n2 = [1, 0, 1]举例,n1的[3, 1]区间和n2的[1, 0]区间公共最长子数组长度为1,当n1[2] == n2[2]的时候,公共最长子数组是没办法算的,你想dp[i - 1][j - 1] + 1是绝对不行的,因为n1[2]和n2[2]不一定能接在这个最长子数组后面,子数组必须是连续的!!!
前面以区间为关注对象,没办法推导状态转移方程,那我们就以n1[i]和n2[j]为子数组结尾进行分析。
我们定义一个二维表,定义状态表示为dp[i] [j]:同时以n1的i位置和n2的j位置结尾的公共最长子数组长度。 -
状态转移方程
对n1[i]和n2[j],我们分情况讨论:
(1)n1[i] == n2[j]时,可以同时接在以n1[i - 1]和n2[j - 1]为结尾的公共最长子数组后面,长度加1,即dp[i] [j] = dp[i - 1] [j - 1] + 1。
(2)n1[i] != n2[j]时,同时以n1[i]和n2[j]为结尾的公共最长子数组不存在,即dp[i] [j] = 0。 -
初始化
为了避免越界,我们多开一行一列,dp数组下标从1开始,多出来的一行一列初始化为0即可。(注意处理与n1和n2数组的下标映射,因为n1和n2数组是从下标0开始的) -
填表顺序
填表顺序为行从上到下,每一行从左到右。 -
返回值
没法直接确定最长子数组的结尾,所以一边dp一边更新最大值。
- 代码实现
class Solution {
public:int findLength(vector<int>& n1, vector<int>& n2) {int m = n1.size(), n = n2.size();//dp[i][j]表示以nums1的i位置和nums2的j位置结尾的公共最长子数组长度vector<vector<int>> dp(m + 1, vector<int>(n + 1));int ret = 0;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(n1[i - 1] == n2[j - 1]) //注意下标映射dp[i][j] = dp[i - 1][j - 1] + 1;ret = max(ret, dp[i][j]);}return ret;}
};
相关文章:
动态规划:两个数组的dp问题(C++)
动态规划:两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列(中等)2.不同的子序列(困难)3.通配符匹配(困难)4.正则表达式(困难)5.交错字符串(中等&…...
BASH shell脚本篇2——条件命令
这篇文章介绍下BASH shell中的条件相关的命令,包括:if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令,请参考:BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…...
【图论C++】Floyd算法(多源最短路径长 及 完整路径)
>>>竞赛算法 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在算法竞赛学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记ÿ…...
小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式 专栏介绍专栏地址专栏介绍 模板方法模式角色分类抽象类(Abstract Class)具体子类(Concrete Class)抽象方法(Abstract Method)具体方法(C…...
C#程序中很多ntdll.dll、clr.dll的线程
如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。...
低代码工作流程管理系统:提升企业运营效率的利器
业务运营状况是否良好,除了人员需要配合以外,真正发挥作用的是背后的工作流程。将重复的工作进行自动化处理,确保这些流程最终指向同一个目标、实现一致的运营结果。而设计和实施不佳的工作流程则产生相反的效果——导致处理时间延长、运营成…...
HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值
《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。 如何使用regexp_extract®exp_replace函数将以上文本中所有书籍名称都提取出来? select substr(regexp_replace(regexp_extract(regexp_…...
debian 安装matlab2022b报错解决方法与问题解决思路
报错 terminate called after throwing an instance of ‘std::runtime_error’ 在安装目录执行 ./bin/glnxa64/MATLABWindow通过执行以上命令发现是和libharfbuzz库有关。 该库在调用freetype库时,有方法找不到。 偿试remove freetype库,发现该库有大…...
Jenkins集成AppScan实现
一、Jenkins上安装插件 在Jenkins里安装以下插件 ibm-security-appscanstandard-scanner 二、打开AppScan 1、配置需要扫描的地址 配置需要扫描的地址 2、记录好要扫描的URL登录序列 记录好要扫描的URL登录序列 3、导出要扫描的URL登录序列设置 导出要扫描的URL登录序列设置 三…...
10.1 File类
前言: java.io包中的File类是唯一一个可以代表磁盘文件的对象,它定义了一些用于操作文件的方法。通过调用File类提供的各种方法,可以创建、删除或者重命名文件,判断硬盘上某个文件是否存在,查询文件最后修改时间&…...
[论文笔记]UNILM
引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…...
LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略
LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…...
国庆作业2
select实现服务器并发 代码: #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…...
fork仓库的代码如何同步主仓库代码
1.背景 我fork了一份 jekyll-theme-chirpy 仓库的代码(基于 jekyll 的自建博客仓库,可以免服务器),我需要在上面更新我的博客文章,但是我又想一直同步 jekyll-theme-chirpy 仓库的新功能,这样我可以更新自己的博客功能。所以我就…...
【Axure】元件库和母版、常见的原型规范、静态原型页面制作
添加现有元件库 点击元件库——载入 当然也可以创建元件库,自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例,顶部状态栏高度为20 左侧类似于标尺,因为图标、文字离最左侧的间距是不一样的 信…...
在设备树中描述中断
参考文档: 内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt 在设备树中,中断控制器节点中必须有一个属性: interrupt-controller,表明它是“中断控制器”。 还必须有一个属性: #interru…...
ccf_csp第一题汇总
ccf_csp第一题汇总 printf()输出格式大全(附 - 示例代码)现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…...
uniapp 实现下拉筛选框 二次开发定制
前言 最近又收到了一个需求,需要在uniapp 小程序上做一个下拉筛选框,然后找了一下插件市场,确实有找到,但不过他不支持搜索,于是乎,我就自动动手,进行了二开定制,站在巨人的肩膀上&…...
实现单行/多行文本溢出
在日常开发展示页面,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为了提高用户的使用体验,这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示,超出…...
Spring Boot中的Binder类
介绍 Spring Boot中的Binder类是一个用于绑定属性的工具类。它可以将配置文件中的属性值绑定到Java对象中,从而方便地进行配置管理。 简单示例 import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environmen…...
leetcode之打家劫舍
leetcode 198 打家劫舍 leetcode 213 打家劫舍 II leetcode 337. 打家劫舍 III 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#…...
走进Spring的世界 —— Spring底层核心原理解析(一)
文章目录 前言一、Spring中是如何创建一个对象二、Bean的创建过程三、推断构造方法四、AOP大致流程五、Spring事务 前言 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("config.xml"); UserService userService (UserService) cont…...
快看看你的手机有没有:谷歌Android全面封杀此类软件!
谷歌坐不住了,因为Android应用商店中,充斥着大量可窃取用户数据的应用,所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索,而该应用是典型的窃取用户数据的应用,其除了可以从手机中提取个人数据外&…...
spark ui 指南
spark ui 指南 1.sparkUI 基本介绍2.jobs页面3.stages 页面4.storage 页面5.environment 页面6.ececutor 页面7 sql 页面 spark ui 是反应一个spark 作业执行情况的页面,通过查看作业的执行情况,分析作业运行的状态. 1.sparkUI 基本介绍 进入运行主页面如下,主要有6各部…...
【分布式事务】
文章目录 解决分布式事务的思路seata四种模式1. XA模式2. AT模式AT模式与XA模式的区别是什么?脏写问题 3. TCC模式事务悬挂和空回滚 4. SAGA模式 四种模式对比口述AT模式与TCC模式高可用 什么是分布式事务? 分布式事务,就是指不是在单个服务或…...
linux 清除卸载jenkins
1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 查看服务 ps -ef|grep jenkins 停掉进程 kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 删掉相关安装目录 rm -rf /root/.jenkins/# 删掉war包 rm -rf /…...
番外4:VMware安装
step4: 安装过程中,有些选项不需要点(安装地址建议选C盘或默认,装载在其他盘后续会报错),如: may error(本人猜测安装虚拟机完整版需要C盘的一些桥插件支持): step5: 安装虚拟机成功…...
Oracle 19.20 patch 注意事项
1. 打patch 用root 打 /u01/app/19.0.0/grid/OPatch/opatchauto apply /u01/app/patch/35319490 2.打patch 之前 所有NODE上OPatch 版本要一样 3. OPatch 目录不要是root权限 4.打一台,一台自动重启。 有几个node 在几个node 打。patch 都要传到不同的node上 …...
ElementUI之增删改及表单验证
⭐⭐本文章收录与ElementUI原创专栏:ElementUI专栏 ⭐⭐ ElementUI的官网:ElementUI官网 目录 一.前言 二.使用ElementUI完成增删改 2.1 后台代码 2.2 前端代码 三.使用ElementUI完成表单验证 一.前言 本章是继上一篇的基础之上在做完善࿰…...
【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解
数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用,几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互,即 JDBC(Java 数据库连接)。本文将深入探讨 JDBC 的…...
b2b电子商务网站盈利模式/国家高新技术企业
计算机应用专业英文求职信导语:“人生在勤,不索何获”,我会努力工作,把工作做得更好,更出色来回报你的信任,愿与贵单位荣辱与共,与同事携手并进,在平凡的工作中来实现我人生的价值&a…...
西安市建设委员会的网站/南宁网站推广哪家好
1. find find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -ex…...
制作网页和做网站是一个意思吗/网站查询服务器
本文欢迎转载,转载请注明出处和作者。由于各种监控系统的实时告警,都需要使用邮箱进行发送,而其中使用SMTP协议的邮箱,各种监控系统、ITSM系统等支持最广泛。为测试监控系统的告警功能,需要先搭建1个SMTP邮箱。实验环境…...
南昌集团制作网站公司/网站关键词优化排名公司
第一步:引入Jsoup和lang和lang3的依赖:Jsoup是HTML解析器lang和lang3这两个包里有转换所需的工具类org.jsoupjsoup1.11.3commons-langcommons-lang2.6org.apache.commonscommons-lang33.4第二步:直接使用即可:import org.apache.c…...
推广网站排名/抖音seo关键词优化排名
Groovy中对Json的操作 我们以一个List 为例,把它转成json,在转为List 实体类: class Person {String nameint agedef eat() {println "${name} 在吃饭"}Overridepublic String toString() {return "Person{" "na…...
wordpress 空间商/app联盟推广平台
CRM客户关系管理系统源码 crm小程序源码 基于springbootvue MySQL数据库开发的客户关系管理系统。 客户全流程高效管理,客户资料管理,客户跟踪管理,订单、合同管理,回款及交付管理等功能。 功能介绍 1、系统管理:员工…...