算法沉淀——前缀和(leetcode真题剖析)

在这里插入图片描述

算法沉淀——前缀和

  • 01.一维前缀和
  • 02.二维前缀和
  • 03.寻找数组的中心下标
  • 04.除自身以外数组的乘积
  • 05.和为 K 的子数组
  • 06.和可被 K 整除的子数组
  • 07.连续数组
  • 08.矩阵区域和

前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和,并将这些前缀和保存在辅助数组中,从而在查询某个区间的和时能够以常数时间复杂度进行计算。

在这里插入图片描述

在实际应用中,前缀和算法经常用于解决与区间和相关的问题,例如子数组和的最大值、最小值、等于目标值的个数等。前缀和的应用能够优化问题的时间复杂度,提高算法的效率。

01.一维前缀和

题目链接:https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId=230&tqId=2021480&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

描述

给定一个长度为n的数组a1,a2,....an.

接下来有q次查询, 每次查询有两个参数l, r.

对于每个询问, 请输出al+al+1+....+ar

输入描述

第一行包含两个整数n和q.

第二行包含n个整数, 表示a1,a2,....an.

接下来q行,每行包含两个整数 l和r.

输出描述

输出q行,每行代表一次查询的结果.

示例1

输入:

3 2
1 2 4
1 2
2 3

输出:

3
6

思路

  1. 通过数组 arr 存储输入的 n 个整数,数组 dp 存储数组 arr 的前缀和。
  2. 使用循环读取数组元素,并计算前缀和 dp
  3. 进行 q 次查询,每次查询给定一个区间 [l, r]。查询结果为 dp[r] - dp[l-1],表示数组在区间 [l, r] 的和。
  4. 输出每次查询的结果。

代码

#include <iostream>
using namespace std;

int main() {
    int n,q;
    cin>>n>>q;
    long long arr[100001]={0},dp[100001]={0};

    for(int i=1;i<=n;++i){
        cin>>arr[i];
        dp[i]=arr[i]+dp[i-1];
    }

    while(q--){
        int l,r;
        cin>>l>>r;

        cout<<dp[r]-dp[l-1]<<endl;
    }
    return 0;
}

02.二维前缀和

题目链接:https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc?tpId=230&tqId=2023819&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

描述

给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2

请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,

输入描述

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

1≤n,m≤1000
1≤q≤10^5
−109≤`a[i][j]`≤109
11≤x1​≤x2​≤n
1≤y1​≤y2​≤m

输出描述

输出q行,每行表示查询结果。

示例1

输入:

3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4

输出:

8
25
32

思路

首先要注意下面求区域和的坐标是相对位置坐标,而不是数组下标,根据题意我们在前缀和数组中存储时,每个位置存储的都应该是相对起始位置的矩阵和,这样我们可以通过计算得到某一个区域内的矩阵和

前缀和计算
在这里插入图片描述
使用前缀和计算矩阵和
在这里插入图片描述

通过这两个公式我们就可以来进行代码的编写了

  1. 通过数组 arr 存储输入的二维数组元素,数组 dp 存储二维数组的前缀和。
  2. 使用两层循环读取二维数组元素,并计算前缀和 dp
  3. 进行 q 次查询,每次查询给定一个矩形区域 [x1, y1, x2, y2]。查询结果为 dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1],表示矩形区域的和。
  4. 输出每次查询的结果。

代码

#include <iostream>
using namespace std;

int arr[1100][1100];
long long dp[1100][1100];

int n,m,q,x1,x2,y1,y2;

int main() {
    cin>>n>>m>>q;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            cin>>arr[i][j];
            dp[i][j]=dp[i-1][j]+dp[i][j-1]+arr[i][j]-dp[i-1][j-1];
        }
    }
    
    while(q--){
        cin>>x1>>y1>>x2>>y2;
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;;
    }
    
    return 0;
}

03.寻找数组的中心下标

题目链接:https://leetcode.cn/problems/find-pivot-index/

给你一个整数数组 nums ,请计算数组的 中心下标

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:

输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。

示例 3:

输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。

思路

这里我们可以使用前缀和和后缀和两个数组,再进行遍历,相遇时相等的下标就是中心下标

  1. 创建两个辅助数组 lr,分别表示数组 nums 中每个位置左侧元素的和和右侧元素的和。
  2. 通过两个循环分别计算 lr 数组的值。在计算 l 数组时,从左到右累加 nums 数组中当前位置及其左侧的元素。在计算 r 数组时,从右到左累加 nums 数组中当前位置及其右侧的元素。
  3. 最后,再通过一个循环遍历数组 nums,找到一个索引,使得 l[i](左侧元素的和)等于 r[i](右侧元素的和),如果找到了这样的索引,则返回该索引;否则返回 -1。

代码

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n=nums.size();
        vector<int> l(n),r(n);

        for(int i=1,j=n-2;i<n;i++,j--){
            l[i]=l[i-1]+nums[i-1];
            r[j]=r[j+1]+nums[j+1];
        }

        for(int i=0;i<n;i++)
            if(l[i]==r[i]) return i;

        return -1;
    }
};

04.除自身以外数组的乘积

题目链接:https://leetcode.cn/problems/product-of-array-except-self/

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 **不要使用除法,**且在 O(*n*) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

示例 2:

输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]

提示:

  • 2 <= nums.length <= 105
  • -30 <= nums[i] <= 30
  • 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内

思路

首先我们这里可以使用前缀和思想,类似上一题,我们求出前缀积和后缀积,但在这里我们要错开一位,错开的那一位补1,不影响最后的运算结果,之后错位相乘就是剩下的数之积

  1. 创建两个辅助数组 lmrm,分别表示数组 nums 中每个位置左侧元素的乘积和右侧元素的乘积。这两个数组的长度都为 n + 1,并初始化为全 1。
  2. 通过两个循环分别计算 lmrm 数组的值。在计算 lm 数组时,从左到右累乘 nums 数组中当前位置及其左侧的元素。在计算 rm 数组时,从右到左累乘 nums 数组中当前位置及其右侧的元素。
  3. 最后,再通过一个循环遍历数组 nums,计算 ret[i] 的值,即 lm[i]rm[i] 的乘积。

代码

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n=nums.size();
        vector<int> lm(n+1,1),rm(n+1,1),ret(n);

        for(int i=1,j=n-2;i<n;i++,j--){
            lm[i]=lm[i-1]*nums[i-1];
            rm[j]=rm[j+1]*nums[j+1];
        }

        for(int i=0;i<n;++i) ret[i]=lm[i]*rm[i];

        return ret;
    }
};

05.和为 K 的子数组

题目链接:https://leetcode.cn/problems/subarray-sum-equals-k/

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 104
  • -1000 <= nums[i] <= 1000
  • -107 <= k <= 107

思路

这里我们使用前缀和算法时,不用真的去创建前缀和数组,而是里哈希辅助记录前缀和次数标记,计算sum-k如果在哈希中有标记,说明前面累加时存在和合法子数组,累加次数。

  1. 初始化一个哈希表 hash,其中 hash[0] 表示和为 0 的子数组的个数,初始化为 1
  2. 使用两个变量 sumret,其中 sum 表示当前累积的和,ret 表示满足条件的子数组的个数,初始化为 0
  3. 遍历数组 nums,累积和并更新哈希表。
    • 对于每个元素 x,更新 sum += x
    • 检查是否存在之前的累积和 sum - k 在哈希表中,如果存在,则累加 hash[sum - k]ret
    • 更新哈希表中的当前累积和 sum 的计数。
  4. 返回最终的结果 ret

举例说明

考虑输入数组 nums = [1, 2, 3, 4, 5],以及 k = 7

  • 初始时,sum = 0hash[0] = 1
  • 遍历到元素 1 时,sum = 1,检查 hash[1 - 7](即 hash[-6]),不存在,继续。
  • 遍历到元素 2 时,sum = 3,检查 hash[3 - 7](即 hash[-4]),不存在,继续。
  • 遍历到元素 3 时,sum = 6,检查 hash[6 - 7](即 hash[-1]),不存在,继续。
  • 遍历到元素 4 时,sum = 10,检查 hash[10 - 7](即 hash[3]),存在,累加 hash[3](即 ret += 1)。
  • 遍历到元素 5 时,sum = 15,检查 hash[15 - 7](即 hash[8]),不存在,继续。

最终,ret 的值为 1,表示有一个和为 7 的子数组。

代码

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        hash[0]=1;
        int sum=0,ret=0;
        for(const auto& x : nums){
            sum+=x;
            if(hash.count(sum-k)) ret+=hash[sum-k];
            hash[sum]++;
        }
        return ret;
    }
};

06.和可被 K 整除的子数组

题目链接:https://leetcode.cn/problems/subarray-sums-divisible-by-k/

给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

示例 1:

输入:nums = [4,5,0,-2,-3,1], k = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 k = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

示例 2:

输入: nums = [5], k = 9
输出: 0 

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • 2 <= k <= 104

思路

其实这里和上面的解法是一致的,只不过我们这里需要注意一点就是关于负数取余的修正。

  1. 初始化哈希表: unordered_map<int, int> hash; 表示创建一个哈希表,用于存储前缀和的余数以及对应的出现次数。其中,hash[0 % k] = 1; 表示初始时,前缀和为 0 的余数的个数为 1。
  2. 遍历数组:for(auto x : nums) 的循环中,遍历数组 nums。对于每个元素 x,执行以下操作:
    • sum += x; 累加当前位置的元素,得到当前位置的前缀和。
    • int r = (sum % k + k) % k; 计算修正后的余数 r,确保余数为正。这一步的目的是处理负数的情况,保证余数范围在 [0, k-1] 之间。
    • if(hash.count(r)) ret += hash[r]; 检查之前是否存在相同的余数 r,如果存在,则将哈希表中对应的次数累加到结果 ret 中。
    • hash[r]++; 更新哈希表,将当前余数 r 的次数加一。
  3. 返回结果: 最终返回 ret,即和可被 K 整除的子数组个数。

核心思想是利用哈希表存储前缀和的余数以及对应的出现次数,通过统计相同余数出现的次数,得到满足条件的子数组个数。

举例说明:

考虑输入数组 nums = [4,5,0,-2,-3,1]k = 5

  • 初始时,sum = 0hash[0 % 5] = 1
  • 遍历到元素 4 时,sum = 4r = (4 % 5 + 5) % 5 = 4,检查哈希表中是否有余数为 4 的记录,不存在,继续。
  • 遍历到元素 5 时,sum = 9r = (9 % 5 + 5) % 5 = 4,检查哈希表中是否有余数为 4 的记录,存在,累加哈希表中的次数(即 ret += 1),更新哈希表。
  • 以此类推,最终得到和可被 K 整除的子数组个数。

代码

class Solution {
public:
    int subarraysDivByK(vector<int>& nums, int k) {
        unordered_map<int,int> hash;
        hash[0%k]=1;
        int sum=0,ret=0;
        for(const auto& x:nums){
            sum+=x;
            int r=(sum%k+k)%k;
            if(hash.count(r)) ret+=hash[r];
            hash[r]++;
        }
        return ret;
    }
};

07.连续数组

题目链接:https://leetcode.cn/problems/contiguous-array/

给定一个二进制数组 nums , 找到含有相同数量的 01 的最长连续子数组,并返回该子数组的长度。

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1

思路

这里我们将问题转化成和为0的最大长度即可,将0当作-1,即与前几题解法类似

  1. 初始化哈希表: unordered_map<int, int> hash; 表示创建一个哈希表,用于存储前缀和以及对应的出现位置。初始时,将前缀和为 0 的位置设为 -1,以处理从数组开头开始的子数组。
  2. 遍历数组:for(int i=0; i<nums.size(); ++i) 的循环中,遍历数组 nums。对于每个元素 nums[i],执行以下操作:
    • 如果 nums[i] 是 0,则令 sum += -1;如果是 1,则令 sum += 1。这样,sum 就表示当前位置的前缀和,其中 0 对应 -1,1 对应 1。
    • 判断哈希表中是否存在当前前缀和 sum。如果存在,说明从上次该前缀和出现的位置到当前位置的子数组的和为零,更新最长长度 ret
    • 如果哈希表中不存在当前前缀和 sum,则将当前前缀和和对应的位置存入哈希表中。
  3. 返回结果: 最终返回 ret,即连续子数组的和为零的最长长度。

这种方法的核心思想是通过维护一个哈希表,记录每个前缀和第一次出现的位置。当相同的前缀和再次出现时,说明两次出现之间的子数组的和为零,从而可以更新最长长度。

举例说明:

考虑输入数组 nums = [0,1,0,1]

  • 初始时,sum = 0hash[0] = -1
  • 遍历到第一个元素 0 时,sum = -1,哈希表中没有 -1,将当前前缀和和对应的位置存入哈希表中,得到 hash[-1] = 0
  • 遍历到第二个元素 1 时,sum = 0,哈希表中存在 0,更新最长长度 ret = 2
  • 以此类推,最终得到连续子数组的和为零的最长长度。

代码

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        unordered_map<int,int> hash;
        hash[0]=-1;

        int sum=0,ret=0;
        for(int i=0;i<nums.size();++i){
            sum+=nums[i]==0?-1:1;
            if(hash.count(sum)) ret=max(ret,i-hash[sum]);
            else hash[sum]=i;
        }
        return ret;
    }   
};

08.矩阵区域和

题目链接:https://leetcode.cn/problems/matrix-block-sum/

给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

  • i - k <= r <= i + k,
  • j - k <= c <= j + k
  • (r, c) 在矩阵内。

示例 1:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]

示例 2:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n, k <= 100
  • 1 <= mat[i][j] <= 100

思路

这里其实是一个经典的二维前缀和问题,但是需要处理好边界问题和相对位置,计算公式可参考本篇文章第二道算法题模板。

  1. 初始化:
    • int m=mat.size(),n=mat[0].size(); 获取输入矩阵的行数和列数。
    • vector<vector<int>> dp(m+1,vector<int>(n+1)); 创建二维数组 dp,用于存储矩阵的前缀和。
  2. 计算前缀和数组 dp
    • 使用两层循环遍历矩阵中的每个元素,计算前缀和数组 dp
    • dp[i][j] 表示从矩阵左上角 (0,0)(i-1,j-1) 的元素和。
  3. 计算每个块的和:
    • 使用两层嵌套循环遍历矩阵中的每个元素,计算每个块的和。
    • 对于每个位置 (i,j),计算块的左上角和右下角的坐标,确保不超过矩阵边界。
    • 利用前缀和数组 dp 计算块的和,并将结果存入结果矩阵 ret[i][j] 中。
  4. 返回结果矩阵 ret 包含了每个块的和。

代码

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {
        int m=mat.size(),n=mat[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        vector<vector<int>> ret(m,vector<int>(n));
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                dp[i][j]=dp[i-1][j]+dp[i][j-1]+mat[i-1][j-1]-dp[i-1][j-1];
        
        for(int i=0;i<m;++i){
            for(int j=0;j<n;++j){
                int x1=max(0,i-k)+1,y1=max(0,j-k)+1;
                int x2=min(m-1,i+k)+1,y2=min(n-1,j+k)+1;

                ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
            }
        }
        return ret;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python之组合数据类型-列表

列表操作 列表增删改查列表增加元素的方法列表删除元素的方法列表修改元素的方法列表查找元素的方法 列表其他常用方法列表的切片用法列表修改排序的方法列表的常用符号、常用函数 列表是什么&#xff1f; 列表是有序集合&#xff0c;列表可以一次性存储几个或几万个元素&#…

[机器学习]KNN——K邻近算法实现

一.K邻近算法概念 二.代码实现 # 0. 引入依赖 import numpy as np import pandas as pd# 这里直接引入sklearn里的数据集&#xff0c;iris鸢尾花 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 切分数据集为训练集和测试…

基于Python 网络爬虫和可视化的房源信息的设计与实现

摘 要 一般来说&#xff0c;在房地产行业&#xff0c;房源信息采集&#xff0c;对企业来说至关重要&#xff0c;通过人工采集数据的方式进行数据收集&#xff0c;既耗时又费力&#xff0c;影响工作效率&#xff0c;还导致信息时效性变差&#xff0c;可靠性偏低&#xff0c;不利…

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法&#xff08;Great Wall Construction Algorithm&#xff0c;GWC…

Zabbix交换分区使用率过高排查

Zabbix High swap space usage 问题现象 Zabbix 出现Highswap space usage(less than 50% free)告警&#xff0c;提示交换分区空间使用率超过50% 处理过程 1. 确定swap分区是否已占满 free -h登录Zabbix服务器检查内存情况&#xff0c;检查发现Linux服务器空闲的内存还有不少…

Docker安装RcoketMQ

1、Docker安装RcoketMQ-4.9.4 在同级文件夹创建目录config&#xff0c;并在里面创建文件broker.conf&#xff0c;文件内容如下&#xff1a; brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDis…

【C/C++ 03】堆排序

堆排序是选择排序算法的进阶&#xff0c;也就是通过二叉树节点存储数组&#xff0c;并通过root节点存储最值与二叉树最后一个节点进行交换完成排序&#xff0c;降低了时间复杂度。在大数据时代&#xff0c;堆排序常用于处理Top-K问题。 排序对象&#xff1a;数组时间复杂度&am…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备&#xff08;例如硬盘&#xff09;是否可读写&#xff0c;但在Java中并没有直接针对硬件级别的磁盘探活API。然而&#xff0c;我们可以模拟一个场景&#xff0c;即检查某个目录或文件是否可以被Java程序正常读写&#xff0c;以此作为主盘活跃的一个…

MySQL安全(一)权限系统

一、授权 1、创建用户 在MySQL中&#xff0c;管理员可以通过以下命令创建用户&#xff1a; namelocalhost IDENTIFIED BY password; name是要创建的用户名&#xff0c;localhost表示该用户只能从本地连接到MySQL&#xff0c;password是该用户的密码。如果要允许该用户从任何…

源码安装nginx并提供服务脚本

一、下载nginx ①官网复制下载链接 ②在Linux中下载 [rootopenEuler2 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、解压并指定路径 [rootopenEuler2 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/ 三、安装依赖 dnf install -y gcc gcc-c mak…

在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1?

一、问题 在Visual Studio 2022中将源文件扩展名改为 .c 后&#xff0c;没有显示 #define _CRT_SECURE_NO_WARNINGS 1&#xff1f; 二、解答 对于使用了不安全的C运行时库函数&#xff08;如strcpy、scanf等&#xff09;而触发的安全警告&#xff0c;编译器不会默认包含_CRT_S…

汽车网络安全dos, someip

汽车Cyber Security入门之DoS 攻防 - 知乎 3、SOME/IP-TP 近年来火热地谈论下一代EE架构和SOA的时候&#xff0c;总离不开SOME/IP这个进程间通讯协议。在许多应用场景中&#xff0c;需要通过UDP传输大型的SOME/IP有效载荷。鉴于在以太网上传输数据包的大小限制&#xff0c;SO…

学科网免费自助代下载

这个网站制作的初衷&#xff0c;是为了解决我的教师朋友&#xff0c;没办法很自由的从学科网上下载资料的烦恼。 访问链接&#xff1a;http://47.119.19.90/xuekewang/#/downloadFile 演示视频&#xff1a; 学科网下载演示视频 只需要 获取下载码 &#xff0c;然后 输入下载链…

Vue-40、Vue中TodoList案例

1、MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" v-model"title" keyup.enter"add"></div> </template>&…

YOLOv8改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(降低100W参数,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合模块,在本文的下面均会有讲解,…

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)

EasyCaching属于开源缓存库&#xff0c;支持基本缓存方式及高级缓存用法&#xff0c;提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型&#xff0c;本文学习最基础的InMemory方式的基本用法。   EasyCaching.InMemory包属于基于内存的缓存库&#xff0c;使用的…

记录Postman接口测试,配置token为全局变量,配置测试环境

为什么要进行接口测试&#xff1a; 因为不同端&#xff08;前段&#xff0c;后端&#xff09;的工作进度不一样&#xff0c;所以我们要针对最开始出来的接口&#xff0c;以及需要调用其他公司的&#xff08;银行&#xff0c;支付宝&#xff0c;微信&#xff0c;qq等&#xff0…

ardupilot 遥控器输入量如何转换成目标加速度

目录 文章目录 目录摘要1.理论依据2程序细节分析3.代码实现 摘要 主要根据遥控器的横滚&#xff0c;俯仰通道值转换成对应的欧拉角度&#xff0c;然后根据欧拉角度转换成地理坐标系下的目标加速度的过程。 1.理论依据 2程序细节分析 根据公式&#xff08;8&#xff09;我们可…

【开源】基于JAVA+Vue+SpringBoot的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

关于C++ 出现Bus error问题的排查

前言 项目代码中经常出现莫名其妙的Bus error问题&#xff0c;并且代码中增加很多try catch 后依然不能将错误捕获&#xff0c;一旦Bus erro出现&#xff0c;进程直接崩溃掉。类似如下这种: 经查询google&#xff0c;出现该问题一般是因为地址未对齐引起的&#xff0c;也就是…