【贪心算法】贪心算法七
贪心算法七
- 1.整数替换
- 2.俄罗斯套娃信封问题
- 3.可被三整除的最大和
- 4.距离相等的条形码
- 5.重构字符串
点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.整数替换
题目链接: 397. 整数替换
题目描述:
算法原理:
解法一:模拟(递归 + 记忆化搜索)
假设n = 18,我们要干的事情是把18变成1最小的步数。因为18是一个偶数只能除2变成9,拿到9这个数字,要干的其实也是一件相同的事情,要把9变成1最小的步数。
此时这里就出现了重复的子问题,大问题是18变成1的最小步数,18/2=9后就从了9变成1的最小步数的相同问题。因此我们可以把重复子问题拿到设计出函数头
int dfs(int n) 给一个整数n返回n变成1的最小步数。函数体 其实就是题目给的,如果n是偶数/2,如果n是奇数要么+1,要么-1我们求得是最小步数所以是 min(dfs(n-1),dfs(n+1)),递归出口 当 n == 1是之间返回0就行了。
在递归过程中发现大量重复,就可以用记忆化搜索,建一个数组,但是这道题的数据范围是1 <= n <= 2^31 - 1,我们要开这么大的空间肯定不行,因此搞一个hash<int,int> 第一个参数对应数字n,第二个参数对应这个数变成1的最小步数。
class Solution {unordered_map<int,int> hash;
public:int integerReplacement(int n) {return dfs(n);}// 递归int dfs(long long n) // 细节问题 数据范围1 <= n <= 2^31 - 1 加1会越界{if(n == 1){return 0;}if(n % 2 == 0) // 如果是偶数 {return 1 + dfs(n / 2);}else{return 1 + min(dfs(n - 1), dfs(n + 1));}}// 记忆化搜索int dfs(long long n){if(hash.count(n)){return hash[n];}if(n == 1){hash[1] = 0;return hash[1];}if(n % 2 == 0){hash[n] = 1 + dfs(n / 2);return hash[n];}else{hash[n] = 1 + min(dfs(n - 1), dfs(n + 1));return hash[n];}}
};
解法二:贪心
补充知识:二进制
- 偶数:二进制表示中最后一位是 0
- 奇数:二进制表示中最后一位是 1
- /2 操作:二进制表示中统一右移一位
我们这里研究的都是整数。
前两个可以自己举例看看。我们看最后一个
接下来想我们的贪心策略:
如果n是偶数没法贪,只能执行/2操作
是奇数就可以贪,要么执行+1,要么执行-1操作。
在模拟解法我们就是试试+1操作和-1操作看谁最小,但是如果在没有试之前就已经知道是+1好还是-1好,直接让奇数沿着较好的选择走,就可以舍去一个选择,那我们的时间复杂度会变得更优。
所以我们的贪心就是判断是+1好还是-1好。
如何判断?分情况讨论:
奇数的二进制最后一位是0,所以我们可以把奇数分为两大类
第一类:前面二进制位是 …,最后两个二进制位是 01
第二类:前面二进制位是 …,最后两个二进制位是 11
其中第一类我们默认 n > 1,也就是说 … 有1,如果没有1的话就是00…01了,直接返回即可。第二类默认 n > 3。
如果是 …01,接下来要么执行+1操作,要么执行-1操作。 +1操作会变成 …10,-1操作会变成 …00,那到底那个操作好呢? +1和-1操作都会变成偶数,偶数只能执行/2操作。假设…01是 …10001,执行+1操作会变成10010在执行/2操作会变成1001,执行-1操作会变成10000在执行/2操作会变成1000。这个时候就可以看出那个操作好了,肯定是-1操作好,因为1000我们可以一直/2操作尽快得到1,1001还需要在+1和-1操作在/2操作。
所以是奇数二进制最后两位是01,就执行-1操作,然后/2操作,会比较快得到1。
如果是 …11,接下来也是要么执行+1操作,要么执行-1操作,分析过程和上面一样。
但是n > 3这里有一个意外,当 n = 3的时候,我们需要特殊讨论,n = 3,二进制位前面都是0,后面虽然也是11。但是这里我们执行-1操作得到…10,然后在执行/2操作,直接就变成1了。这个和选择是不一样的。如果执行+1操作就会多一步/2操作。
我们这个贪心不用证明,分类讨论过程本身就是对这个贪心的证明。
那如何写代码呢?
如何判断二进制最后两位是01还是11呢?
拿n%4就可以了,因为n是奇数%4只能得到1和3,如果是1就是01情况,如果是3就是11情况。
class Solution {unordered_map<int,int> hash;
public:int integerReplacement(int n) {int ret = 0;while(n > 1){if(n % 2 == 0){n /= 2;++ret;}else{if(n == 3){ret += 2;n = 1;}else if(n % 4 == 1){n = n / 2;ret += 2;}else{n = n / 2 + 1;ret += 2;}}}return ret;}
};
2.俄罗斯套娃信封问题
题目链接: 354. 俄罗斯套娃信封问题
题目分析:
给一个二维数组,每一行表示信封的宽度和高度,当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)
算法原理:
解法一:常规解法(通用解法)-> 动态规划
先对数组排序,如果不排序的话,去找某一个信封能去套谁的时候,既要去它左边找找,也要去右边找找。说白了就是要变量数组一遍,才能去确定这个信封能去套谁。
但是如果我们把这个数组按照左端点排序后,此时在去确定一个信封能去套谁的时候,仅需去左边看看就行了。因为如果能套必须满足左大于左,右大于右,我们已经按左端点排好序,右边的左都比当前的左大,因此不用考虑右边。
此时我们的最长套娃序列特别像之前的最长递增子序列问题,最长递增子序列是在原始的数组中挑选一些数出来形成递增的序列,问最长的长度是多少。我们这里是在一些信封里面挑一些信封出来使它能形成一个套娃序列,问最长的套娃序列是多少。这个问题就和最长递增子序列一模一样。无非最长子序列是在一个个数中挑,我们这里是在一个个信封里面挑。
1.状态表示
dp[i] 表示:以 i 位置的信封为结尾的所有套娃序列中,最长套娃序列的长度
2.状态转移方程
根据最近一步,划分情况
i 位置本身就是套娃序列 ,长度是1
以 i 位置为结尾的最长套娃长度,那么就去 0 ~ i - 1 这段区间遍历一遍找到一个j位置,只要发现 i 信封 能套到 j 信封 外面,那此时用dp[j]在加上 i 这一个信封就是以 i 位置的信封为结尾套娃序列的长度。找到 0 ~ i -1 区间所有能套的 dp[j] + 1 的最大值,就是 i 位置的信封为结尾的所有套娃序列中,最长套娃序列的长度。
3初始化
数组初始为1,就可以不用考虑为的1情况
4.填表顺序
从左往右
5.返回值
dp[i] 表示:以 i 位置的信封为结尾的所有套娃序列中,最长套娃序列的长度。我们要的是整个区间最长套娃序列的长度,所以返回dp表中的最大值。
class Solution {
public:int maxEnvelopes(vector<vector<int>>& e) {// 动态规划sort(e.begin(), e.end());int n = e.size();vector<int> dp(n, 1);int ret = 1;for(int i = 1; i < n; ++i){for(int j = 0 ; j < i; ++j){if(e[j][0] < e[i][0] && e[j][1] < e[i][1])dp[i] = max(dp[i], dp[j] + 1);}ret = max(ret, dp[i]);}return ret;}
};
因为这道题的数据量太大我们的动规会超时,但是动规是解决这类题的常规方法。这道题不行不代表相同类型的题不行,比如1263. 推箱子这道题用动规是可以通过的。
解法二:重写排序 + 贪心 + 二分
动态超时了,肯定得用贪心 + 二分了,但是为什么多一个重写排序呢?
如果我们仅仅只是按照左端点排序,接下来用贪心和二分,你会发现我们要分类讨论,原因就是之前研究的最长递增子序列只有一个限定条件 只在一堆数中去挑,然后贪心保留是长度为1,长度为2 … 的最后一个元素的最小值,比如长度为2:5,现在来了一个3,我们可以把5干掉,保留3,原因是能跟在5的后面更能跟在3的后面。但是我们这道题给的是一个个区间,有的时候我们并不能直接删除,有的时候是把之前结果保留而把新来的给删除。虽然能做但是需要分类讨论比较麻烦。所以我们先重写排序在贪心和二分。
下面我们给的是左端点都是不同的排完序后的样子,如果左端点不一样,我们其实可以把左端点删去。原因就是左端点都不一样,我们还按照左端点从小到大排好序了,那就相当于前面的是严格递增,所以不考虑前边信封左端点是多少。那不就变成了在 3、1、8、12、3中挑一个最长递增子序列了嘛。
但是我们这里是可能有重复的左端点的,假设有重复的话,我们排完序是下面这种情况,如果我们继续不看左端点,我们可能会挑出来4、6、7、9长度为4的序列,但是这并不符合,原因就是我们的左必须大于左才能套。
那如何避免这种情况呢?很简单当左端点相同的时候,我们就按照右端点从大到小排序。当继续不看左端点,我们在挑7的时候绝对不要9,因为当左边相同的时候右边是按照从大到小排的,同理挑4绝对不会考虑前三个。
重写排序后就完完全全变成只有一个限制的最长递增序列了。
class Solution {
public:int maxEnvelopes(vector<vector<int>>& e) {// 重写排序 + 贪心 + 二分sort(e.begin(), e.end(),[&](vector<int>& e1, vector<int>& e2){return e1[0] != e2[0] ? e1[0] < e2[0] : e1[1] > e2[1];});// 贪心 + 二分vector<int> ret;ret.push_back(e[0][1]);int n = e.size();for(int i = 1; i < n; ++i){if(e[i][1] > ret.back()){ret.push_back(e[i][1]);}else{int left = 0, right = ret.size() - 1;while(left < right){int mid = (left + right) >> 1;if(ret[mid] < e[i][1])left = mid + 1;elseright = mid;}ret[left] = e[i][1];}}return ret.size();}
};
3.可被三整除的最大和
题目链接: 1262. 可被三整除的最大和
题目分析:
这道题的意思是给一个数组,在这个数组中挑一些数使这些数的和能被3整除,并且这些挑的这些数的和是最大的。
算法原理:
解法一:正难则反 + 贪心 + 分类讨论
题目要在数组中挑一些数的和能被3整除并且和是最大的,我们可以直接把整个数组中的数全部挑出来,%3正好等于0,那我就不用考虑了,如果%3不等于,那我在全部挑选的基础上删一些数就可以了。
先把所有的数累加在一起,根据累加和,删除一些数
假设所有数的和是sum,接下来就分类讨论:
- sum % 3 == 0
直接返回sum
- sum % 3 == 1
我们定义一些数,x :标记 % 3 == 1 的数,y : 标记 % 3 == 2 的数
如果%3 == 1,必定有下面几种情况:
第一种情况:
-
存在一个%3 == 1 的数,剩下所有数的和%3 == 0
-
存在四个%3 == 1 的数,剩下所有数的和%3 == 0,其实可以把三个%3 == 1的数归到剩下所有数的和%3 == 0里面
-
存在七个%3 == 1 的数,剩下所有数的和%3 == 0,也可以把六个%3 == 1的数归到剩下所有数的和%3 == 0里面
剩下的也不用枚举了,我们只用考虑第一种情况就行了,原因就是不管这里有多少种情况,我们仅需删去第一种情况的x1就可以让剩下的数的和%3==0。
那么贪心的地方来了,要删除怎样的x1,肯定是最小的x1。因为我们想让sum的和最大。
第二种情况:
存在两个%3 == 2 的数 y1,y2 (2 + 2 = 4 % 3 = 1),或者和上面一样存在y1、y2、y3、y4…,但是和上面一样我们仅需第一种情况就行了,此时删y1,y2。此时贪的地方来了,为了使sum最大,删y1和y2,一个是最小的,一个是次小的。
因为sum %3 == 1 会分为这两种情况,因此我们取这两种情况的最大值。
- sum % 3 == 2
也是两种情况,要么存在一个y1 使sum % 3 == 2,要么存在一个x1,一个x2 使 sum % 3 == 2。我们依旧取两种情况的最大值。
如何求一堆数中的最小值以及次小值?
同理求一堆数中的最大值和次大值也是一样的求法。
第一种方法:sort排序 O(nlogn)
第二种方法:分类讨论
先定义两个数x1、x2,然后初始化为无穷大。然后从左到右遍历根据新来的x,分类讨论:
- x < x1
- x1 < x < x2
3. x > x2
并不影响最小和次小的。所以不用考虑
class Solution {
public:int maxSumDivThree(vector<int>& nums) {const int INF = 0x3f3f3f3f;int sum = 0, x1 = INF, x2 = INF, y1 = INF, y2 = INF;for(auto x: nums){sum += x;if(x % 3 == 1){if(x < x1) x2 = x1, x1 = x;else if(x < x2) x2 = x;}else if(x % 3 == 2){if(x < y1) y2 = y1, y1 = x;else if(x < y2) y2 = x;} }//分类讨论if(sum % 3 == 0) return sum;else if(sum % 3 == 1) return max(sum - x1, sum - y1 - y2);else return max(sum - y1, sum - x1 - x2);}
};
解法二:动态规划
从一堆数中选取一些数,使这些数的和能被3整除。其实这道题就是一个01背包问题。
1.状态表示
dp[i][j] 表示:从前 i 个数中选取一些数,这些数的和模3等于 j (0 <= j < 3) 时,最大值的和是多少
2.状态转移方程
根据最后一个位置,划分情况
不选 i 位置这个数,那就去 0 ~ i - 1 区间去选一些数的和模3等于j 时最大值的和,正好是 dp[i-1][j]
选 i 之后,还是去 0 ~ i - 1 区间去选一些数的和模3,但是此时就不是直接去找和模3等于 j 的了,因为 i 位置这个数 nums[i] % 3 会等于0、1、2 中的任意一个数,那么去 0 ~ i - 1区间去找和模3等于 的 j 也要随 nums[i] % 3 的改变而去改变。
以nums[i]%3 == 1为例,如果求的dp[i][0],那就要去 0 ~ i -1 区间去找和%3 但是 j 为 2 的情况,因为这个和 加上 nums[i] 才会有 和 % 3 等于 0,比如 nums[i] 是 1,去 0 ~ i - 1找的和是2,2 % 3 = 2, (2 + 1)% 3 == 0 。同理求dp[i][1],dp[i][2]也是一样。
我们要求的是最大和,因此取两种情况的最大值
3.初始化
- 多开一行,列开3个
- 里面的值要保证后序的填表是正确的
- 下标的映射关系
第一行为空表示没有数可以选,此时和%3等于0,不选就行了,直接就是0,第一格填0,没有数可以选还要和%3 == 1 和 2 是不可能存在的,可以给这两个位置得值位-1表示不存在得情况,但是我们下面写代码要判断一下 不等于-1 才能要这个状态,但是因为我们求得又是最大值,我们可以使它俩足够小就行了这样就可以不用去判断了,也不会影响填表。因此可以给-0x3f3f3f3f。
第一列除了第一格下面的不用初始化。直接放在填表里面就行了。
4.填表顺序
从上往下,从左往右
5.返回值
dp[i][j] 表示:从前 i 个数中选取一些数,这些数的和模3等于 j (0 <= j < 3) 时,最大值的和是多少,我们要得使从所有数种选一些数,这些数得和%3 == 0 最大值是多少,因此返回的是 dp[n][0]
class Solution {
public:int maxSumDivThree(vector<int>& nums) {// 动态规划const int INF = 0x3f3f3f3f;int n = nums.size();vector<vector<int>> dp(n + 1, vector<int>(3, -INF));dp[0][0] = 0;for(int i = 1; i <= n; ++i)for(int j = 0; j < 3; ++j)dp[i][j] = max(dp[i - 1][j], dp[i - 1][(j - nums[i -1] % 3 + 3) % 3] + nums[i - 1]);return dp[n][0];}
};
优化:利用滚动数组做优化
背包问题哪里我们使用的是一个数组充当滚动数组,但是这里我们要用两个数组充当滚动数组,因为%3可能会等于0、1、2,那在一个数组中更新下一行的值及其可能会覆盖j 为 0 、1、2的任何位置,比如 填 j = 0,会用到 j = 1, 但是填 j 也可能会用到 j = 0,但是前面已经把 j = 0 更新了找不到之前的值了,所以这里我们用两个数组充当滚动数组,就不担心这个问题了。并且如果是两个数组充当滚动数组,01背包优化填表顺序从左往右,从右往左都行。
class Solution {
public:int maxSumDivThree(vector<int>& nums) {// 利用滚动数组优化(二个数组)const int INF = 0x3f3f3f3f;int n = nums.size();vector<int> dp(3, -INF);dp[0] = 0;for(int i = 1; i <= n; ++i){vector<int> ndp(3);for(int j = 0; j < 3; ++j)ndp[j] = max(dp[j], dp[(j - nums[i -1] % 3 + 3) % 3] + nums[i - 1]);dp = move(ndp);}return dp[0];}
};
4.距离相等的条形码
题目链接: 1054. 距离相等的条形码
题目分析:
算法原理:
解法:贪心 + 模拟
我们这道题就是让我们把这些数重新排列一下,相邻的两个不相同。此时我们这样考虑问题,我们有9个格子,把给的数放到格子里让相邻的两个不相同就可以了。此时我们可以这样处理,把相同的数看出一批数,每次摆放一批数,摆放的时候仅需让这些相同的数不相邻就可以了。如何做到不相邻特别简单,每次摆的时候隔一个格子。这样绝对会让相同的数不相邻。
我们先在偶数位上摆,摆完后在摆奇数位。此时摆完后会发现相邻两个数是不相同的。
贪心策略:
- 每次处理一批相同的数
- 摆放的时候,每次隔一个格子
但是这个策略还有一个问题,可能会有把相同的数放在相邻的位置,这里我们还要多加一个限定条件。
- 先处理出现次数最多的那个数,剩下的数的处理顺序无所谓
证明:
题目一定有解,我们可以得到一个性质,假设有n个数,我们可以分成 (n+1)/2 个组。如果题目一定有解,我们可以证明的是:出现次数最多的那个数,不超过(n+1)/2个。
假设出现次数最多的那个数,超过(n+1)/2个。那此时去摆这些数的时候必定会有一组里面出现相同的数。但是题目一定有解,因此出现次数最多的那个数,不超过(n+1)/2个。
我们的策略是先处理出现次数最多的那个数,剩下的数的处理顺序无所谓。
第一种情况:出现次数最多的数,正好出现 (n + 1)/2。我们先处理最多的那个数,剩下的数无论怎么放都不会相邻。
第二种情况:出现次数最多的数,小于(n + 1)/ 2。此时我们也可以证明相同的数不相邻,因为如果相邻必定是后面的数x出现次数还要比o还要多,但是这种情况绝对不会存在。因为我们的前提就是出现次数最多的数,小于(n + 1)/ 2,那就是x就是出现次数最多的数。但是我们是优先处理出现次数最多的那次数。所以如果是先填o,x绝对不可能相邻。
class Solution {
public:vector<int> rearrangeBarcodes(vector<int>& b) {// 统计每个数出现的频次unordered_map<int,int> hash;int maxVal = 0, maxCount = 0;for(auto x : b){if(maxCount < ++hash[x]){maxCount = hash[x];maxVal = x;}}// 先处理出现次数最多的那个数int n = b.size();vector<int> ret(n);int index = 0;for(int i = 0; i < maxCount; ++i){ret[index] = maxVal;index += 2; }//处理剩下的数hash.erase(maxVal);for(auto& [x, y] : hash){for(int i = 0; i < y; ++i){if(index >= n) index = 1;ret[index] = x;index += 2;}}return ret;}
};
5.重构字符串
题目链接: 767. 重构字符串
题目分析:
算法原理:
解法:贪心 + 模拟
- 每次处理一批相同的字符
- 摆放的时候,隔一个位置放一个字符
- 优先处理出现次数最多的那一个字符
这道题并没有告诉我们一定会有排序,所以我们要先判断一下是否有排列,方法很简单,出现次数最多的字符个数不超过(n+1)/2就行了。
class Solution {
public:string reorganizeString(string s) {// 统计每个字符出现的频次int hash[26] = { 0 };char maxChar = ' '; int maxCount = 0;for(auto ch : s){if(maxCount < ++hash[ch - 'a']){maxCount = hash[ch - 'a'];maxChar = ch;}}// 先判断⼀下int n = s.size();if(maxCount > ((n + 1) / 2)) return "";// 先处理出现次数最多的那个字符string ret(n,' ');int index = 0;for(int i = 0; i < maxCount; ++i){ret[index] = maxChar;index += 2;}//处理剩下的数hash[maxChar - 'a'] = 0;for(int i = 0; i < 26; ++i){for(int j = 0; j < hash[i]; ++j){if(index >= n) index = 1;ret[index] = 'a' + i;index += 2;}} return ret;}
};
相关文章:
【贪心算法】贪心算法七
贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃…...
MySQL 锁概述
1.锁的分类 根据不同的分类角度可将锁分为: 按是否共享分:S 锁、X 锁按粒度分:表级锁、行级锁、全局锁(锁整个库)、页锁(锁数据页)意向锁:意向 S 锁、意向 X 锁:都是表…...
springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
牙科诊所管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定牙科诊所管理系统的…...
overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案
在插入pdf 配图后,编译出错提示信息如图,很可能的一个原因是pdf文件大小太大了,最好压缩一下,压缩到1MB以内。...
LabVIEW神经肌肉电刺激与记录系统
神经肌肉电刺激技术在康复医学和神经科学领域占有重要地位。基于LabVIEW开发了神经肌肉电刺激与记录系统,该系统具备可控电脉冲输出与高效数据采集功能,适用于临床和科研领域。 项目背景 神经肌肉电刺激技术用于治疗各类神经和肌肉系统疾病,…...
【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...
Label-Studio X SAM 半自动化标注
教程:playground/label_anything/readme_zh.md at main open-mmlab/playground GitHub B站视频:Label Studio x Segment Anything Model 半自动化标注_哔哩哔哩_bilibili 需要注意: 1.LINUX上跑比较方便 2.中文路径、文件名闯大祸 3. 4…...
Mono里运行C#脚本8—mono_image_storage_open打开EXE文件
Mono里运行C#脚本8—mono_image_storage_open打开EXE文件 前面分析哈希表的实现,以及文件打开的底层函数,还有保存到HASH表里的数据结构。 static MonoImageStorage * mono_image_storage_open (const char *fname) { char *key = NULL; key = mono_path_resolve_symlinks…...
【WebSocket】tomcat内部处理websocket的过程
websocket请求格式 浏览器请求 GET /webfin/websocket/ HTTP/1.1。 Host: localhost。 Upgrade: websocket。 Connection: Upgrade。 Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg。 Origin: http://服务器地址。 Sec-WebSocket-Version: 13。 服务器响应 HTTP/1.1 101 Swi…...
将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)
封装组件看这个,然后理解父子组件传值 应用场景: 1.使用v - model语法实现双向绑定(传值两边都不用定义方法接数据) 1.子组件 1. update:modelValue事件是MultiSelect组件对象自带的事件 2.:options"countries" opti…...
Linux下通用型shellcode的编写
实验目的及要求 目的: 通过对本实验执行过程的理解,认真分析总结,能够独立的在 Linux 下进行 shellcode 的编写。 要求: (1)%70:完成对 shellcode 的分析及提取 (2)%…...
STM32F103RCT6学习之二:GPIO开发
GPIO基础 1.简介 2.GPIO基本结构 3.种模式 GPIO基本功能 1.输出功能--LED灯闪烁 1)进行基本配置 2)编辑代码 主要在main.c中编辑。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------------------------------…...
kong网关使用pre-function插件,改写接口的返回数据
一、背景 kong作为api网关,除了反向代理后端服务外,还可对接口进行预处理。 比如本文提及的一个小功能,根据http header某个字段的值,等于多少的时候,返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...
C++、Python有哪些相同和不同
C 和 Python 是两种流行的编程语言,设计理念和应用场景各有不同,但也有一些相似之处。以下是它们在语言特性、性能、语法等方面的相同点和不同点的比较: 相同点 支持多种编程范式: 面向对象编程 (OOP):两者都支持类、继…...
Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports
Spring Boot 提供了强大的自动配置功能,通过约定优于配置的方式大大简化了应用开发。随着版本迭代,自动配置的实现方式也逐渐优化,从早期的 spring.factories 文件到最新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConf…...
HarmonyOS Next 应用元服务开发-应用接续动态配置迁移按需退出
按需退出,支持应用动态选择迁移成功后是否退出迁移源端应用(默认迁移成功后退出迁移源端应用)。如果应用不想让系统自动退出迁移源端应用,则可以设置不退出,参数定义见SUPPORT_CONTINUE_SOURCE_EXIT_KEY。 示例&#x…...
SQL-leetcode-180. 连续出现的数字
180. 连续出现的数字 表:Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中,id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…...
使用Python pickle模块进行序列化
使用Python pickle模块进行序列化 在Python中,pickle模块是一个用于实现数据序列化与反序列化的强大工具。与json模块不同的是,pickle支持将几乎所有的Python对象进行序列化,包括字典、列表、类实例,甚至函数。这使得它在处理复杂…...
责任链模式(ChainofResponsibilityPattern)
文章目录 1.定义2.结构3.问题描述代码实现 1.定义 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 2.结构 处理者(Handler):声明了所有具体处理者的通用接口。 该接口通常…...
自定义 Element Plus 树状表格图标
在开发使用 Element Plus 的树状表格时,默认的展开/收起图标可能不能满足设计需求。为了更符合项目要求,可以通过覆盖样式的方式来自定义这些图标。以下记录了实现自定义树状表格图标的完整过程。 实现效果 有子节点且未展开时:显示一个加号…...
Vue2:用一个例子理解一下vue template中属性前面的冒号“:“
常用写法 table中绑定数据,我们通常这么写: <el-table :data="tableData" style="width: 100%">data() {tableData:[], } data绑定变量名可变的动态对象 但是上一篇文中,因为要生成15组相似的table,它们的格式都一样,只是数据…...
AF3 partition_tensor函数源码解读
该函数将输入张量按原子维度 (n_atoms) 分块,以局部窗口方式滑动,生成 滑动窗口张量。 在神经网络中,尤其是处理大规模序列数据(例如蛋白质原子特征)时,直接对整个序列执行操作可能会导致计算和内存效率问题。partition_tensor 函数通过对输入张量进行分块(partitions)…...
C++类与对象上
1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题 例如洗衣服: C是基于面向对象的,关注的是对象,讲一件事拆分成不同的对象,靠对…...
中巨伟业推出高安全高性能32位智能卡内核可编程加密芯片SMEC88SP/ST
1、产品特性 以最高安全等级的智能卡芯片内核为基础,具有极高的软硬件安全性 实现客户关键功能或算法代码下载,用户可以灵活实现自有知识产权的保护 标准 SOP8、SOT23-6 封装形式,器件封装小 标准 I2C 接口,具有接…...
Python微博动态爬虫
本文是刘金路的《语言数据获取与分析基础》第十章的扩展,详细解释了如何利用Python进行微博爬虫,爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了,就是用户利用代码模拟Ajax请求,发…...
包管理工具npm、yarn、pnpm、cnpm详解
1. 包管理工具 1.1 npm # 安装 $ node 自带 npm# 基本用法 npm install package # 安装包 npm install # 安装所有依赖 npm install -g package # 全局安装 npm uninstall package # 卸载包 npm update package # 更新包 npm run script #…...
Docker和Kubernetes(K8s)区别
目录 1. Docker Docker 的核心概念: Docker 的功能: Docker 常见使用场景: 2. Kubernetes (K8s) Kubernetes 的核心概念: Kubernetes 的功能: Kubernetes 常见使用场景: 3.Docker 和 Kubernetes 的…...
龙智出席2024零跑智能汽车技术论坛,分享功能安全、需求管理、版本管理、代码扫描等DevSecOps落地实践
龙智快讯 2024年12月5日,由零跑和盖世汽车主办的“2024零跑智能汽车技术论坛”在杭州零跑总部圆满落幕。此次技术论坛聚焦AI语言大模型、AUTOSAR AP平台、DevOps、端到端自动驾驶等热点话题展开探讨,旨在推动智能汽车技术的创新与发展。 龙智作为国内领先…...
SQL进阶技巧:如何分析双重职务问题?
目录 0 背景描述 1 数据准备 2 问题分析 方法2:利用substr函数,充分利用数据特点【优秀解法】 3 小结 0 背景描述 在 CompuServe 刚成立时,Nigel Blumenthal 遇到一个应用程序中的困难。他需要获取公司人员所担任角色的源表,…...
SAQ问卷的定义,SAQ问卷是什么?
SAQ问卷,全称为可持续发展评估问卷(Sustainability Assessment Questionnaire),是一种在线自评工具,其深远意义与广泛应用在当今商业环境中愈发凸显。它不仅是一种衡量企业在环境、社会和治理(ESGÿ…...
Express.js 有哪些常用的中间件?
在使用 Express.js 开发应用程序时,中间件(Middleware)是处理请求和响应的关键组件。它们可以执行各种任务,如解析请求体、添加HTTP头部、记录日志等。以下是一些常用的中间件: body-parser 用于解析传入的请求体。它…...
K8s DaemonSet的介绍
1. 什么是 DaemonSet? DaemonSet 是 Kubernetes 中的一种控制器,用于确保每个(或某些指定的)节点上运行一个 Pod 副本。它是为部署守护进程设计的,例如需要在每个节点上运行的任务或工具。 特点: Pod 会随…...
同步异步日志系统:设计模式
设计模式是前辈们对代码开发经验的总结,是解决特定问题的⼀系列套路。它不是语法规定,⽽是⼀ 套⽤来提⾼代码可复⽤性、可维护性、可读性、稳健性以及安全性的解决⽅案。 为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开…...
【GO基础学习】Gin 框架中间件的详解
文章目录 中间件详解中间件执行全局中间件路由级中间件运行流程中间件的链式执行中断流程 代码示例 gin框架总结 中间件详解 Gin 框架中间件是其核心特性之一,主要用于对 HTTP 请求的处理进行前置或后置的逻辑插入,例如日志记录、身份认证、错误处理等。…...
ubuntu停止.netcore正在运行程序的方法
在Ubuntu系统中停止正在运行的.NET Core程序,你可以使用以下几种方法: 使用kill命令: 如果你知道.NET Core程序的进程ID(PID),你可以直接使用kill命令来停止它。首先,使用ps命令配合grep来查找.…...
图神经网络_图嵌入_Struc2Vec
0 背景 之前的node embedding方式,都是基于近邻关系,但是有些节点没有近邻,也有结构相似性。如图中的u、v节点。 struc2vec算法适用于捕获结构相似性。 1 相似度(距离)计算 1.1 公式 f k ( u , v ) f k − 1 ( u …...
LabVIEW应用在工业车间
LabVIEW作为一种图形化编程语言,以其强大的数据采集和硬件集成功能广泛应用于工业自动化领域。在工业车间中,LabVIEW不仅能够实现快速开发,还能通过灵活的硬件接口和直观的用户界面提升生产效率和设备管理水平。尽管其高成本和初期学习门槛可…...
js-000000000000
1、js书写的位置 - 内部 <body> <!-- 习惯把 js 放到 /body 的后面 --> <script> console.log(这是内部 js 的书写位置) alert(内部js) </script> </body> <body><!-- 习惯把 js 放到 /body 的后面 --><script>console.log(这…...
【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训
首页-搜索框-跳转 引言 在微信小程序中,首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现,详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...
虚幻引擎是什么?
Unreal Engine,是一款由Epic Games开发的游戏引擎。该引擎主要是为了开发第一人称射击游戏而设计,但现在已经被成功地应用于开发模拟游戏、恐怖游戏、角色扮演游戏等多种不同类型的游戏。虚幻引擎除了被用于开发游戏,现在也用于电影的虚拟制片…...
分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】
背景: 从2008年,从事分布式光纤传感行业已经过了16年时间了,依稀记得2008年,看的第一遍论文就是中国计量大学张在宣老爷子的分布式光纤测温综述,我的经历算是行业内极少数最丰富的之一。混过学术圈: 发表…...
【无标题】学生信息管理系统界面
网页是vue框架,后端直接python写的没使用框架...
ES7+ React/Redux/GraphQL/React-Native snippets 使用指南
VS Code React Snippets 使用指南 目录 简介基础方法React 相关React Native 相关Redux 相关PropTypes 相关控制台相关React 组件相关 简介 ES7 React/Redux/GraphQL/React-Native snippets 是一个用于 VS Code 的代码片段插件,它提供了大量用于 React 开发的代…...
Java中三大构建工具的发展历程(Ant、Maven和Gradle)
🐸 背景 我们要写一个Java程序,一般的步骤是编译,测试,打包。 这个构建的过程,如果文件比较少,我们可以手动使用java, javac,jar命令去做这些事情。但当工程越来越大,文件越来越多,…...
【国产NI替代】32振动/电压(配置复合型)高精度终端采集板卡,应用于复杂的大型测量场景
32振动/电压(配置复合型)高精度终端采集板卡 采用 EP4CE115F29I7 型号的 FPGA ,是一款 高精度,多通道动态信号采集器,主要应用 在复杂的大型测量并对成本要求不敏感的场 合,默认具备 8 个测量板卡&#…...
服务器上加入SFTP------(小白篇 1)
在服务器上配置 SFTP (基于 SSH 的文件传输协议) 通常比传统 FTP 更安全,因为它默认加密通信。以下是详细的配置步骤,以 Ubuntu 或 CentOS 为例。 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇 2) 3.代码加入SFTP JAVA —&#…...
突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界
当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时,整个科技界都为之震惊。这一举动意味着,曾经遥不可及的强大AI能力,如今可以被嵌入到像ESP32这样的微型控制器中,真正地将AI的触角延伸到了物联网和边缘计算…...
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的影视网站系统的设计与实现
开题报告 随着互联网的快速发展和普及,人们对于娱乐和信息的需求越来越大。影视网站作为一种提供短视频、影视、电视剧、综艺节目等视频资源的网站,受到了广大用户的喜爱。然而,现有的影视网站系统仍然存在着一些安全性不强,用户…...
前端技术(26) : 全年排班日历
来源: 通义千问 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>年度日历</title><style>body {font-family: Arial, sans-serif;}.calendar-container {margin: 20px au…...
Linux网络——TCP的运用
系列文章目录 文章目录 系列文章目录一、服务端实现1.1 创建套接字socket1.2 指定网络接口并bind2.3 设置监听状态listen2.4 获取新链接accept2.5 接收数据并处理(服务)2.6 整体代码 二、客户端实现2.1 创建套接字socket2.2 指定网络接口2.3 发起链接con…...