LeetCode 92 双周赛

news2025/2/3 17:52:38

2481. 分割圆的最少切割次数

圆内一个 有效切割 ,符合以下二者之一:

  • 该切割是两个端点在圆上的线段,且该线段经过圆心。
  • 该切割是一端在圆心另一端在圆上的线段。

一些有效和无效的切割如下图所示。

img

给你一个整数 n ,请你返回将圆切割成相等的 n 等分的 最少 切割次数。

提示1 <= n <= 100

示例

img

输入:n = 4
输出:2
解释:
上图展示了切割圆 2 次,得到四等分。

思路:

简单找规律。若需要切成偶数份,则需要的切割次数为份数的一半;若要切成奇数份,则切割次数等于份数。

注意当n = 1时,不需要任何切割,这一点容易被遗漏。

class Solution {
public:
    int numberOfCuts(int n) {
        if (n == 1) return 0;
        return n % 2 == 0 ? n / 2 : n;
    }
};

2482. 行和列种一和零的差值

给你一个下标从 0 开始的 m x n 二进制矩阵 grid

我们按照如下过程,定义一个下标从 0 开始的 m x n 差值矩阵 diff

  • 令第 i 行一的数目为 o n e s R o w i onesRow_i onesRowi
  • 令第 j 列一的数目为 o n e s C o l j onesCol_j onesColj
  • 令第 i 行零的数目为 z e r o s R o w i zerosRow_i zerosRowi
  • 令第 j 列零的数目为 z e r o s C o l j zerosCol_j zerosColj
  • d i f f [ i ] [ j ] = o n e s R o w i + o n e s C o l j − z e r o s R o w i − z e r o s C o l j diff[i][j] = onesRow_i + onesCol_j - zerosRow_i - zerosCol_j diff[i][j]=onesRowi+onesColjzerosRowizerosColj

请你返回差值矩阵 diff

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 10^5
  • 1 <= m * n <= 10^5
  • grid[i][j] 要么是 0 ,要么是 1

示例:

img

输入:grid = [[0,1,1],[1,0,1],[0,0,1]]
输出:[[0,0,4],[0,0,4],[-2,-2,2]]
解释:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[2][0] = onesRow2 + onesCol0 - zerosRow2 - zerosCol0 = 1 + 1 - 2 - 2 = -2
- diff[2][1] = onesRow2 + onesCol1 - zerosRow2 - zerosCol1 = 1 + 1 - 2 - 2 = -2
- diff[2][2] = onesRow2 + onesCol2 - zerosRow2 - zerosCol2 = 1 + 3 - 2 - 0 = 2

思路:

预处理出每一行和每一列的零和一的数量,然后模拟即可。(实际可以直接统计一的数量减去零的数量)

class Solution {
public:
    vector<vector<int>> onesMinusZeros(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<int> rows(m, 0), cols(n, 0);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j]) rows[i]++, cols[j]++;
                else rows[i]--, cols[j]--;
            }
        }
        
        vector<vector<int>> ans(m, vector<int>(n));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans[i][j] = rows[i] + cols[j];
            }
        }
        return ans;
    }
};

2483. 商店的最少代价

给你一个顾客访问商店的日志,用一个下标从 0 开始且只包含字符 'N''Y' 的字符串 customers 表示:

  • 如果第 i 个字符是 'Y' ,它表示第 i 小时有顾客到达。
  • 如果第 i 个字符是 'N' ,它表示第 i 小时没有顾客到达。

如果商店在第 j 小时关门(0 <= j <= n),代价按如下方式计算:

  • 在开门期间,如果某一个小时没有顾客到达,代价增加 1
  • 在关门期间,如果某一个小时有顾客到达,代价增加 1

请你返回在确保代价 最小 的前提下,商店的 最早 关门时间。

注意,商店在第 j 小时关门表示在第 j 小时以及之后商店处于关门状态。

提示:

  • 1 <= customers.length <= 10^5
  • customers 只包含字符 'Y''N'

示例:

输入:customers = "YYNY"
输出:2
解释:
- 第 0 小时关门,总共 1+1+0+1 = 3 代价。
- 第 1 小时关门,总共 0+1+0+1 = 2 代价。
- 第 2 小时关门,总共 0+0+0+1 = 1 代价。
- 第 3 小时关门,总共 0+0+1+1 = 2 代价。
- 第 4 小时关门,总共 0+0+1+0 = 1 代价。
在第 2 或第 4 小时关门代价都最小。由于第 2 小时更早,所以最优关门时间是 2 。

思路:

对于每个位置i,预处理一下[0, i - 1]区间内N的数量,以及[i, n - 1]区间内Y的数量,然后遍历一次计算答案即可。注意边界的处理。

class Solution {
public:
    int bestClosingTime(string c) {
        int n = c.size();
        vector<int> prev(n + 1, 0), post(n + 1, 0);
        
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            prev[i] = cnt;
            if (c[i] == 'N') cnt++;
        }
        prev[n] = cnt;
        
        cnt = 0;
        for (int i = n - 1; i >= 0; i--) {
            if (c[i] == 'Y') cnt++;
            post[i] = cnt;
        }
        
        int ans = 0, minCost = n;
        for (int i = n; i >= 0; i--) {
            int cost = post[i] + prev[i];
            if (cost <= minCost) {
                minCost = cost;
                ans = i;
            }
        }
        return ans;
    }
};

2484. 统计回文子序列数目

给你数字字符串 s ,请你返回 s 中长度为 5回文子序列 数目。由于答案可能很大,请你将答案对 10^9 + 7 取余 后返回。

提示:

  • 如果一个字符串从前往后和从后往前读相同,那么它是 回文字符串
  • 子序列是一个字符串中删除若干个字符后,不改变字符顺序,剩余字符构成的字符串。
  • 1 <= s.length <= 10^4
  • s 只包含数字字符

示例:

输入:s = "103301"
输出:2
解释:
总共有 6 长度为 5 的子序列:"10330" ,"10331" ,"10301" ,"10301" ,"13301" ,"03301" 。
它们中有两个(都是 "10301")是回文的。

思路:

由于从子序列数目非常多,所以周赛当晚又想到了计算单个元素对答案的贡献这样的思路。就开始想,由于回文长度为5,且回文具有对称性,那么只需要计算某个位置的字符作为回文串的第一个,第二个字符即可。如果某个位置的字符x作为回文序列的第一个字符,那么我们需要找到其对称的最后一个字符,只要确定最后一个字符的位置,我们就可以把问题转变为求解中间区间内,长度为3的回文子序列的个数。也就是我们需要求解中间某个区间[i, j]内长度为3的回文子序列的个数。

这个思路需要2个信息:

  1. 关于某个位置的字符x,是否在这个位置后,还存在某个位置,字符同样是x
  2. 关于某个区间内的长度为3的回文子序列的个数

第一点,可以通过一次遍历,将每个相同的字符,出现过的位置都记录下来;但是这样在枚举某个字符x时,假设该字符出现过的位置共有n个,那枚举该字符作为长度为5的回文子序列的最外侧两端字符,需要枚举n^2。由于整个字符串长度为10^4,只包含0-9这些数字,那么可以认为每个字符,平均会在10^3个位置上出现,那枚举一个字符作为长度为5的回文子序列的两侧的字符,都需要10^6的复杂度,共有10种字符,那么就至少需要10^7复杂度,这还不包括计算的时间开销。

并且对于第2点,如何计算某个区间内的长度为3的回文子序列,这我想了半天也都无法解决。设dp[i][j]表示某个区间[i, j]内长度为3的回文子序列的长度,由于ij各自都能取到字符串长度这么大的值,那光是状态的个数都已经达到n^2,即10^8了,就算每个状态的计算只需要 O ( 1 ) O(1) O(1),这也不可行。

但我就还是想用动态规划来做。我当时想的是,设dp[i][j][k]表示区间[i, j]内的长度为k的回文子序列的个数。由于直接自底向上进行状态计算,一定会计算至少n^2个状态,但其实有很多状态是无效的。所以我想用自顶向下,用记忆化搜索来做。于是便写出了如下代码

class Solution {
public:

    int INF = 1e9 + 7;
    
    vector<vector<vector<int>>> dp;

    // 找到 <= limit的最后一个位置
    int find(vector<vector<int>>& f, int x, int limit) {
        int n = f[x].size();
        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (f[x][mid] <= limit) l = mid;
            else r = mid - 1;
        }
        return l;
    }

    // 计算区间[l, r]内, 长度为k的回文子序列的个数
    int dfs(int l, int r, int k, string& s, vector<vector<int>>& f) {
        if (dp[l][r][k] != -1) return dp[l][r][k];
        if (k == 1) return r - l + 1;
        int ans = 0;
        // 枚举这个区间内每个位置作为回文序列的两端字符
        for (int i = l; i <= r; i++) {
            int u = s[i - 1] - '0';
            // 找到这个字符出现的<= r的最远的位置, 并开始往回遍历
            for (int j = find(f, u, r); j >= 0; j--) {
                int v = f[u][j]; // 找到这个字符作为右侧对称的位置
                if (v - i + 1 < k) break; // 两个位置之间的字符数量 < k, 则不可能, 剪枝
                ans = (ans + dfs(i + 1, v - 1, k - 2, s, f)) % INF;
            }
        }
        return dp[l][r][k] = ans;
    }

    int countPalindromes(string s) {
        vector<vector<int>> f(10);
        int n = s.size();
        for (int i = 0; i < n; i++) {
            f[s[i] - '0'].push_back(i + 1); // 下标从1开始
        }
        dp = vector<vector<vector<int>>>(n + 1, vector<vector<int>>(n + 1, vector<int>(6, -1)));
        return dfs(1, n, 5, s, f);
    }
};

提交后,意料之中的超时了。稍微算了下时间复杂度,最外层的递归中,枚举了[1, n],共n个位置,10^4,内层枚举了该位置字符出现过的所有位置,平均是10^3,这就已经10^7了。然后换了另一种枚举方式,对于每个区间不枚举[l, r]内的每个位置,而枚举0-9,改写了一版代码

class Solution {
public:

    int INF = 1e9 + 7;
    
    vector<vector<vector<int>>> dp;

    // 找到 <= high 的最后一个位置
    int findLess(vector<vector<int>>& f, int x, int high) {
        int n = f[x].size();
        if (n == 0) return -1;
        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (f[x][mid] <= high) l = mid;
            else r = mid - 1;
        }
		if (f[x][l] <= high) return l;
        return -1;
    }
	
	// 找到 >= low 的第一个位置
	int findGreat(vector<vector<int>>& f, int x, int low) {
		int n = f[x].size();
        if (n == 0) return -1;
		int l = 0, r = n - 1;
		while (l < r) {
			int mid = l + r >> 1;
			if (f[x][mid] >= low) r = mid;
			else l = mid + 1;
		}
		if (f[x][l] >= low) return l;
		return -1;
	}

    // 计算区间[l, r]内, 长度为k的回文子序列的个数
    int dfs(int l, int r, int k, string& s, vector<vector<int>>& f) {
        if (dp[l][r][k] != -1) return dp[l][r][k];
        if (k == 1) return r - l + 1;
		if (r - l + 1 < k) return 0; // 区间的长度不足k
		if (r - l + 1 == k) {
			// 区间长度刚好为k, 直接判断区间是否是回文
			int i = l - 1, j = r - 1;
			bool ok = true;
			while (i < j) {
				if (s[i] != s[j]) {
					ok = false;
					break; // 不是回文
				}
				i++;
				j--;
			}
			dp[l][r][k] = ok ? 1 : 0;
			return dp[l][r][k];
		}
        int ans = 0;
		// 枚举所有的字符, 一共就10个
		for (int i = 0; i < 10; i++) {
			int begin = findGreat(f, i, l); // log 10^3 = 10
			int end = findLess(f, i, r);
			if (begin == -1 || end == -1) continue;
			// 计算所有的两侧端点
			for (int j = begin; j < end; j++) {
				for (int t = end; t > j; t--) {
					int ll = f[i][j], rr = f[i][t];
                    if (rr - ll + 1 < k) break; // 可以跳出这一轮循环了
					ans = (ans + dfs(ll + 1, rr - 1, k - 2, s, f)) % INF;
				}
			}
		}
        // 枚举这个区间内每个位置作为回文序列的两端字符
        return dp[l][r][k] = ans;
    }

    int countPalindromes(string s) {
        vector<vector<int>> f(10);
        int n = s.size();
        for (int i = 0; i < n; i++) {
            f[s[i] - '0'].push_back(i + 1); // 下标从1开始
        }
        dp = vector<vector<vector<int>>>(n + 1, vector<vector<int>>(n + 1, vector<int>(6, -1)));
        return dfs(1, n, 5, s, f);
    }
};

提交后发现还是超时,/(ㄒoㄒ)/

枚举中点+前后缀分离

其实我枚举每个字符,计算每个字符对答案的贡献,这样的思路是可以的。但是对于回文这一类的问题,比较好的做法是枚举回文的中点。而我上面是枚举了回文串的首尾两端。

对于枚举中点来说,看以当前元素作为回文序列的中间点,能构成的长度为5的回文序列,那么只要看当前位置之前的ab的回文子序列的数量,以及当前位置之后的ba的回文子序列的数量。由于每个字符都是0-9,所以对于两位的ab,一共能组合出的就只有100种情况。对于每个字符作为中点,只需要暴力枚举所有可能的ab组合,用乘法原理计算,并对答案进行累加即可。由于字符串长度最长为10^4,则总复杂度一共10^6

当我们遍历到位置i时,s[i] = x,我们此时求解一下以x作为中点的回文子序列有多少个,由于回文子序列长度为5,左右两侧是对称的,那么只需要枚举一侧的两位数字,对于每种组合ab,我们看一下,在区间[1, i - 1]内,有多少个ab这样的子序列,假设为L个;再看一下,在区间[i + 1, n]的区间内,有多少个ba这样的子序列,假设为R,那么根据乘法原理,回文子序列abxba一共有L * R个。我们对以x为中点,只需要枚举全部的ab组合即可。(全部的ab组合一共就100种)

L[i][a][b]表示区间[0, i]内的,形如ab的子序列的个数。我们可以用动态规划来计算。考虑第i个位置

  • s[i] != b,那么L[i][a][b] = L[i - 1][a][b]
  • s[i] == b,那么L[i][a][b] = L[i - 1][a][b] + 由s[i]构成的ab的数量

其中当s[i] == b时,还需要额外加上以s[i]构成的ab的个数,这就等于[0, i - 1]区间内所有a的数量

所以我们还需要这样一个东西,设cnt[i][a]表示区间[0, i]内的字符a的数量,由于a的取值只有0-9,所以第二维只需要开到10。那么上面的状态转移方程为:

  • s[i] == b,那么L[i][a][b] = L[i - 1][a][b] + cnt[i - 1][a]

所以我们需要进行一下预处理,对于a ∈ [0, 9],计算一下[1, i]区间内,共有多少个a

同理,对于中点的右侧,即[i + 1, n]区间内,我们需要知道有多少个形如ba的子序列。

我们设R[i][b][a]表示区间[i, n]中,形如ba的子序列的个数。同样的,其状态转移方程如下

  • s[i] != bR[i][b][a] = R[i + 1][b][a]
  • s[i] == b,则R[i][b][a] = R[i + 1][b][a] + 由s[i]构成的ba的数量

s[i] == b时,还需要额外加上以s[i]构成的ab的个数,这就等于[i + 1, n]区间内所有a的数量,计算方式同理,不再赘述

typedef long long LL;
const int N = 1e4 + 10, INF = 1e9 + 7;
class Solution {
public:
	
	int L[N][10][10], R[N][10][10];
	
    int countPalindromes(string s) {
		int cnt[10] = {0};
		int n = s.size();
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j <= 9; j++) {
				for (int k = 0; k <= 9; k++) {
					L[i][j][k] = L[i - 1][j][k];
				}
			}
			int u = s[i - 1] - '0';
			for (int j = 0; j <= 9; j++) {
				L[i][j][u] += cnt[j];
			}
			cnt[u]++;
		}
		
		memset(cnt, 0, sizeof cnt);
		for (int i = n; i >= 1; i--) {
			for (int j = 0; j <= 9; j++) {
				for (int k = 0; k <= 9; k++) {
					R[i][j][k] = R[i + 1][j][k];
				}
			}
			int u = s[i - 1] - '0';
			for (int j = 0; j <= 9; j++) {
				R[i][u][j] += cnt[j];
			}
			cnt[u]++;
		}
		
		int ans = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 0;j <= 9; j++) {
				for (int k = 0; k <= 9; k++) {
					LL m = (LL) L[i - 1][j][k] * R[i + 1][k][j];
					ans = (ans + m) % INF;
				}
			}
		}
		return ans;
    }
};

时间复杂度 O ( n × E 2 ) O(n × E^2) O(n×E2),其中 E = 10 E = 10 E=10, 即 0-9 共10个数字

空间复杂度 O ( n × E 2 ) O(n × E^2) O(n×E2)

其实可以把LR数组优化掉一维。

class Solution {
public:
    
    int preCnt[10];
    
    int postCnt[10];

    int L[10][10];

    int R[10][10];

    int countPalindromes(string s) {
        int n = s.size(), INF = 1e9 + 7;
        for (int i = n - 1; i >= 0; i--) {
            int u = s[i] - '0';
            for (int j = 0; j < 10; j++) {
                R[u][j] += postCnt[j];
            }
            postCnt[u]++;
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
            int u = s[i] - '0';
            // 先撤销该位置的R数组
            postCnt[u]--;
            for (int j = 0; j < 10; j++) {
                R[u][j] -= postCnt[j];
            }
            // L数组还未计算该位置
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    ans = (ans + (long long)L[j][k] * R[k][j]) % INF;
                }
            }
            // 计算L数组
            for (int j = 0; j < 10; j++) {
                L[j][u] += preCnt[j];
            }
            preCnt[u]++;
        }
        return ans;
    }
};

时间复杂度 O ( n × E 2 ) O(n × E^2) O(n×E2),其中 E = 10 E = 10 E=10, 即 0-9 共10个数字

空间复杂度 O ( E 2 ) O(E^2) O(E2)

还可以使用增量计算,再将时间复杂度优化掉一个 E E E,因为每个位置的字符是固定的。(这份代码不能完全理解,待后续更新)

typedef long long LL;
class Solution {
public:
    
    int preCnt[10];
    
    int postCnt[10];

    int L[10][10];

    int R[10][10];

    int countPalindromes(string s) {
        int n = s.size(), INF = 1e9 + 7;
        for (int i = n - 1; i >= 0; i--) {
            int u = s[i] - '0';
            for (int j = 0; j < 10; j++) {
                R[u][j] += postCnt[j];
            }
            postCnt[u]++;
        }

        LL ans = 0, cur = 0;
        for (int i = 0; i < n; i++) {
            int u = s[i] - '0';
            postCnt[u]--;
            for (int j = 0; j < 10; j++) {
                cur -= (LL) postCnt[j] * L[j][u];
                R[u][j] -= postCnt[j];
            }
            ans += cur;
            for (int j = 0; j < 10; j++) {
                cur += (LL) preCnt[j] * R[u][j];
                L[j][u] += preCnt[j];
            }
            preCnt[u]++;
        }
        return ans % INF;
    }
};

时间复杂度 O ( n × E ) O(n × E) O(n×E)

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

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

相关文章

从CRUD到入职阿里,全靠猛刷P8总结的Github所有高热度面试题合集

很多工作过了 5 年之后的工程师&#xff0c;都表示写不动 CRUD 代码了&#xff0c;都会考虑转架构师&#xff0c;但是一想到面试&#xff0c;可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试&#xff0c;我咨询了一下阿里的大佬&#xff0c;了解到每一轮的…

专利解析|数据中台—数据流配置弹框交互优化方法

优化用户交互 在企业信息化转型的过程中&#xff0c;数据中台提供全行业从咨询规划到技术平台落地运营的数字化方案。随着企业规模的不断扩大&#xff0c;企业信息化转型的必要性也逐步地增加&#xff0c;其功能的复杂度更是跨越式地增加。人们在处理信息、学习规程和记忆细节…

【Go】参数验证,对象数组核验-validator

文章目录背景功能介绍范围比较验证标记之间特殊符号说明字符串验证特殊字符串验证例子扩展问题我的问题验证slice举例输出说明详细举例二维slice举例&#xff1a;说明map核验举例输出说明嵌套map核验举例说明参考背景 一直做的 go 项目中想要方便简洁的对接口参数字段进行核验…

HTTP模块的数据结构

1.ngx_module_t 1.1数据定义 背景&#xff1a; ngx_module_t结构体作为所有模块的通用接口&#xff0c;它只定义了init_master、init_module、init_process、init_thread、ext_thread、exit_process、exit_master这7个回调方法&#xff08;事实上&#xff0c;init_master、i…

DEJA_VU3D - Cesium功能集 之 090-台风过境实时动画

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(尽可能把代码简洁一些)。博文内容…

内网穿透软件对比——cpolar : 花生壳(上)

系列文章 内网穿透软件对比——cpolar : 花生壳&#xff08;上&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;中&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;下&#xff09; 文章目录系列文章1. 前言2. 对比内容2.1 官网主页对比2.2 用户注册…

JS中的事件循环机制(Event Loop)

JS中的事件循环机制(Event Loop) javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。非阻塞 JS引擎执行异步任务时&#xff0c;不会一直等待返回结果&#xff0c;主线程会挂起&#xff08;pending&#xff09;这个任务&#xff0c;继续执行其他任务&am…

微三云(陈志坤):共享购商业模式概念、框架、基础制度

各位企业家及创业者朋友们&#xff0c;你们好。我是微三云&#xff08;陈志坤&#xff09;&#xff0c;在你打开这个文章的时候&#xff0c;先不要急&#xff0c;因为任何一个能够长久、安稳、盈利的平台&#xff0c;背后肯定有一位看准宏观方向且耐心的人。这是一个极具颠覆性…

php宝塔搭建部署实战零起飞OA办公管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的零起飞OA办公管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板文字搭建教程 下载源码&#xff0c;宝…

Mybatis对MySQL中BLOB字段的读取

一、使用TEXT还是BLOB&#xff1f; 1、TEXT和BLOB主要差别 主要差别就是BLOB保存二进制数据&#xff0c;TEXT保存字符数据。 目前几乎博客内容里图片都不是二进制存储在数据库的&#xff0c;而是把图片上传到服务器&#xff0c;然后正文里使用<img>标签引用&#xff0c…

电脑系统下载的镜像文件在哪里图解

如果你在小白系统上面下载了镜像文件&#xff0c;但是不知道下载完成怎么找到它的话&#xff0c;下面就和小编一起来看一下小白系统下载的镜像文件知道方法。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型号&#xff1a;惠普战66五代 方法/步骤&#x…

C/C++程序的断点调试 - Microsoft Visual Studio

本文以Microsoft Visual Studio为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff…

【BFS】八数码问题(c++基础算法)

目录 一.读题 二.在做题之前 1.康拓展开 2.DFS和BFS的区别 3.栈和队列的区别 三.做题 1.算法原理 2.算法实现 ①队列 ②康托展开 ③标记 四.AC代码 一.读题 作为最经典的一道宽度优先搜索题&#xff0c;它的题面并不是很难懂。 【宽搜&#xff08;难度&#xff1a;6&a…

爆款短视频拍摄技巧之摇、移、跟拍等,这样拍的视频才更有吸引力,速收藏

爆款短视频拍摄技巧之拍摄手法,这样拍的视频才更有吸引力。 拍摄技巧主要分为两个部分&#xff0c;一个是构图&#xff0c;一个是拍摄手法。上一篇我们聊过了两种构图手法&#xff0c;接下来咱们聊一下拍摄手法&#xff0c;也就是我们常说的推、拉、摇、移、跟这五种手法。 其…

NNDL 2022秋

第一届AI专业&#xff0c;很多课程都是第一次开课&#xff0c;老师和学生都在“摸着石头过河”。 好处是所学内容比较新&#xff0c;跟得上“潮流”&#xff0c;学习意愿比较强。 难处是教学资料相对欠缺&#xff0c;需要学的内容较多&#xff0c;难度较大。 大家经过一学期…

leetcode:1494. 并行课程 II【dfs记忆化 + 状态压缩】

目录题目截图题目分析ac code总结题目截图 题目分析 这道题很像toposort&#xff0c;但实际不是因为那些indeg为先为0的&#xff0c;先选不一定好的考虑到n很小我们使用状态压缩dfs(state)表示当前state下&#xff0c;还需要多少个学期结束用pre数组存一下每个idx对应的前置条…

基于C++11 实现的线程池

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 基于C11 实现的线程池基于C11 实现的线程池1、线程池原理2、线程池的设计思路&#xff1f;3、一个基于C11的优秀的线程池3.1 头文件3.2 线程池类3.3 构造函数实现3.4 入队—添…

ModStartBlog v6.4.0 升级输入过滤、多文件组件,修复已知问题

V6.4.0版本更新 2022年12月20日ModStartBlog发布v6.4.0版本&#xff0c;增加了以下14个特性&#xff1a; [新功能] 富文本过滤规则调整优化[新功能] ArrayPackage数组输入数据包处理器[新功能] 请求输入组件新增多文件路径类型[新功能] 多文件上传组件[新功能] 所有组件新增t…

RCE代码及命令执行(详解)

RCE代码及命令执行1.RCE漏洞1.1.漏洞原理1.2.漏洞产生条件1.3.漏洞挖掘1.4.漏洞分类1.4.1.命令执行1.4.1.1.漏洞原理1.4.1.2.命令执行危险函数1.4.1.3.漏洞检测1.4.2.代码执行1.4.2.1.漏洞原理1.4.2.2.代码执行危险函数1.4.2.3.漏洞检测1.5.命令执行和代码执行区别2.命令执行2.…

QT学习记录(二)最基础的工程

文件 工程新建后会有这几个文件&#xff0c;自动生成的 main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec(); }QApplication a(argc, argv);这里…