【Py/Java/C++三种语言OD2023C卷真题】20天拿下华为OD笔试之【模拟】2023C-攀登者2【欧弟算法】全网注释最详细分类最全的华为OD真题题解

有LeetCode算法/华为OD考试扣扣交流群可加 948025485
可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1336了解算法冲刺训练

文章目录

  • 题目描述与示例
    • 题目描述
      • 输入描述
      • 输出描述
    • 示例
      • 输入
      • 输出
  • 解题思路
    • 原路返回和非原路返回
    • 原路返回走过的总路程
    • 从左边空地出发原路返回
      • 寻找空地
      • 向右登山
      • 构建函数
    • 从右边空地出发原路返回
    • *为什么一定是原路返回(严谨证明)
  • 代码
    • python
    • java
    • cpp
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目描述与示例

题目描述

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。

地图表示为一维数组,数组的索引代表水平位置,数组的高度代表相对海拔高度。其中数组元素 0 代表地面。

例如[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0], 代表如下图所示的地图。,地图中有两个山脉位置分别为 1,2,3,4,58,9,10,11,12,13,最高峰高度分别为4,3。最高峰位置分别为3,10

一个山脉可能有多座山峰(高度大于相邻位置的高度,或在地图边界且高度大于相邻的高度)。

                4+---+|   ||   | 3                       3|   ||   +---+                   -----|       |                   |   |2 |       |                 2 |   |     2|       |                   |   |+---+       |               ----+   |   +---+|           |               |       |   |   |1 |           | 1           1 |       | 1 |   | 1|           |               |       |   |   |+---+           +---+       +---+       +---+   +---+|                   |       |                       |0 |                   | 0   0 |                       | 0|                   |       |                       |+---+                   +-------+                       +---+0   1   2   3   4   5   6   7   8   9  10  11  12  13  14

登山时会消耗登山者的体力(整数),上坡时,消耗相邻高度差两倍的体力,下坡时消耗相邻高度差一倍的体力,平地不消耗体力,登山者体力消耗到零时会有生命危险。

例如,上图所示的山峰:从索引 0,走到索引 1,高度差为 1,需要消耗 2*1=2 的体力;从索引 2 高度 2走到高度 4 索引 3 需要消耗 2*2=4 的体力;从索引 3 走到索引 4 则消耗 1*1=1 的体力。

攀登者想要评估一张地图内有多少座山峰可以进行攀登,且可以安全返回到地面,且无生命危险。

例如上图中的教组,有3个不同的山峰,登上位置在3的山可以从位置0或者位置6开始,从位置0登到山顶需要消耗体力1*2+1*2+2*2=8,从山顶返回到地面0需要消耗体力 2*1+1*1+1*1=4的体力,按照登山路线0->3->0需要消耗体力 12。攀登者至少需要12以上的体力(大于12)才能安全返回。

输入描述

第一行输入 一个长度为N的数组,表示地图。

第二行输入最大体力。

输出描述

输出一个数字,地图中可以攀登到达的山峰数量

示例

输入

0,1,4,3,1,0,0,1,2,3,1,2,1,0
11

输出

2

解题思路

和【模拟】2023C-攀登者1的区别在于,本题除了需要查看峰值的位置,还需要查看这个峰值是否能够在平地位置攀登过去。

本题需要严格地区分上/下山和上/下坡的区别。在后面的题解中:

  • 上/下山表示从平地到达某个山峰或反之
  • 上/下坡表示从低海拔位置走到高海拔位置或反之

原路返回和非原路返回

攀登山峰的方式,一共可以分为四种情况

  • 从左边上山,往左边下山
  • 从右边上山,往右边下山
  • 从左边上山,往右边下山
  • 从右边上山,从左边下山

其中前两者可以统称为原路返回的攀登方式,后两者可以统称为非原路返回的攀登方式。

在本题中,只需要考虑原路返回的攀登方式,无需考虑非原路返回的攀登方式。

因为两条原路返回路径所花费的体力,一定有一条是小于另外两条非原路返回的攀登方式。

(贪心思想不要尝试在考试的时候证明正确性,相信数学直觉)

原路返回走过的总路程

考虑原路返回的攀登方式,这种登山方式,上坡和下坡走过的总路程是一样多的。也是最方便我们计算的。

以题目所给例子为例,如果我们想从索引7的空地位置向右攀登来到索引12的高度为2的山峰并且原路返回到原来的空地,来回的路线分别用红色和绿色标记出来,会发现上山和下山所走过的总路程其实是一样多的。这个结论对于任何一个山峰、任何一个方向都成立

在这里插入图片描述

因此,这里花费的总体力为相邻元素高度差的绝对值的总和乘以3

其中,相邻元素高度差的绝对值的总和表示走过的总路程,而之所以系数为3是因为上坡和下坡各自要花费2倍和1倍高度差的体力。

所以,对于每一个山峰,我们都可以很容易地计算出从左边的某处空地出发,向右攀登到达这个山峰并且沿原路返回到达空地所需要花费的体力

如果这个这个体力超过了所给的初始体力,无法到达该山峰。

从左边空地出发原路返回

那么应该如何计算从从左边某处空地出发向右攀登(后面原路返回),能够攀登到的山峰数量?

寻找空地

我们需要找到若干空地作为出发点,这个空地但必须是上山前的最后一个空地。如

[0, 1, 2, 4, 3, 1, 0, 0, 1, 2, 3, 1, 2, 1, 0]⬆                    ⬆

可以通过以下代码实现

space_list = list()
for i in range(n-1):if nums[i] == 0 and nums[i+1] > 0:space_list.append(i)

向右登山

已知最大体力值为power_max,设在攀登过程中所累积的高度差为route_num,对应花费的体力为route_num * 3

从某一个空地start出发,在一个while循环中不断向右移动,同时更新所经历的高度差route_num。若

  • route_num * 3 > power_max,说明会在攀登过程中体力降为0,无法到达i位置,退出循环
  • 找到了一个山峰,则将位置i记录在数组ans
    • 注意山峰需要区分边界i == n-1和非边界情况i != n-1
for start in space_list:i = start + 1route_num = 0while i < n and nums[i] != 0:route_num += abs(nums[i] - nums[i-1])if route_num * 3 > power_max:breakif i == n-1 and nums[i] > nums[i-1]:ans.append(i)elif nums[i] > nums[i-1] and nums[i] > nums[i+1]:ans.append(i)i += 1

构建函数

上述两部分合并在一起,可以构建出函数cal_peak_from_left(nums, power_max,, n),具体实现如下

def cal_peak_from_left(nums, power_max, n):ans = list()space_list = list()for i in range(n-1):if nums[i] == 0 and nums[i+1] > 0:space_list.append(i)for start in space_list:i = start + 1route_num = 0while i < n and nums[i] != 0:route_num += abs(nums[i] - nums[i-1])if route_num * 3 > power_max:breakif i == n-1 and nums[i] > nums[i-1]:ans.append(i)elif nums[i] > nums[i-1] and nums[i] > nums[i+1]:ans.append(i)i += 1return ans

其中返回的列表ans,为从左边空地出发并原路返回,能够攀登到的所有山峰的索引。可以做如下调用

ans_from_left = cal_peak_from_left(heights, power_max, n)

从右边空地出发原路返回

对于是从右边的某处空地出发,向左攀登到某个山峰并沿原路返回到达空地的情况,也存在上述类似的结论。

很容易想到,整个过程是类似的,只不过整个方向反过来了。

一种方法是,可以构建出一个完全类似的函数cal_peak_from_right(nums, power_max, n)

但一种更加简便、代码复用性更强的做法是,我们可以将从右边空地出发向左攀登,看作是对原高度数组进行反转之后,即对heights[::-1]进行从左边空地出发向右攀登得到的结果。即做如下调用

ans_from_right = cal_peak_from_left(heights[::-1], power_max, n)

由于使用了反转,得到计算得到的索引也是反转的,需要进一步处理才能得到原heights数组中的索引,即

ans_from_right = [n-i-1 for i in ans_from_right]

最终取ans_from_leftans_from_right的交集的长度,即为所有能够攀登到的山峰(不管从左出发还是从右出发原路返回)的索引了。再取并集的长度即为答案。

ans = len(set(ans_from_left + ans_from_right))

*为什么一定是原路返回(严谨证明)

可能有同学就会提出疑问,为什么只考虑原路返回的情况。

这其实是涉及到了贪心思想

贪心不问出处,问就是数学直觉。

假设到达某个山峰,从左边上山、从右边上山、从左边下山、从右边下山各自花费的体力为A, B, C, D

四种方式所对应的体力值分别为

左上左下 = A + C
左上右下 = A + D
右上右下 = B + D
右上左下 = B + C

每段花费的体力都可以分割为两部分,一部分是上坡、一部分是下坡,分别用下标12来表示。那么存在以下的若干式子成立

A = A1 + A2
B = B1 + B2
C = C1 + C2
D = D1 + D2

其中A2, B2, C2, D2不仅表示下坡花费的体力,也同时表示高度

  • A2表示从左边上山经历的下坡高度
  • B2表示从右边上山经历的下坡高度
  • C2表示往左边下山经历的下坡高度
  • D2表示往右边下山经历的下坡高度

由于最终的山峰高度一致,因此存在以下式子成立

C2 - A2 = D2 - B2 > 0

C2 + B2 = A2 + D2

如下图所示

在这里插入图片描述

另外,上坡和下坡的体力消耗也存在倍数关系。譬如,从左边上山的上坡体力消耗A1,是往左边下山的下坡体力消耗C2的两倍。因此存在以下关系

A1 = 2 * C2
C1 = 2 * A2
B1 = 2 * D2
D1 = 2 * B2

代入上述式子可以得到

A = 2 * C2 + A2
B = 2 * D2 + B2
C = 2 * A2 + C2
D = 2 * B2 + D2

进一步可以得到

左上左下 = A + C = (2 * C2 + A2) + (2 * A2 + C2) = 3 * (A2 + C2)
左上右下 = A + D = (2 * C2 + A2) + (2 * B2 + D2) = 2 * (B2 + C2) + (A2 + D2)
右上右下 = B + D = (2 * D2 + B2) + (2 * B2 + D2) = 3 * (B2 + D2)
右上左下 = B + C = (2 * D2 + B2) + (2 * A2 + C2) = 2 * (A2 + D2) + (B2 + C2)

将以下式子带入

C2 + B2 = A2 + D2

可以得到

左上左下 = A + C = (2 * C2 + A2) + (2 * A2 + C2) = 3 * (A2 + C2)
左上右下 = A + D = (2 * C2 + A2) + (2 * B2 + D2) = 3 * (B2 + C2)
右上右下 = B + D = (2 * D2 + B2) + (2 * B2 + D2) = 3 * (B2 + D2)
右上左下 = B + C = (2 * D2 + B2) + (2 * A2 + C2) = 3 * (A2 + D2)

上述方程是非常对称的。又因为

C2 - A2 = D2 - B2 > 0

不妨设C2 >= D2 > A2 >= B2成立(设D2 >= C2 > B2 >= A2也是一样的,会得到(A2 + C2)是最小值)

很容易看出,以下四组数中

(A2 + C2)
(B2 + C2)
(B2 + D2)
(A2 + D2)

一定存在(B2 + D2)是最小值,这里对应着右上右下原路返回的情况。

在这里插入图片描述

我们只需要考虑到达山峰的最小情况即可。

代码

python

# 题目:【模拟】2023C-攀登者2
# 分值:200
# 作者:许老师-闭着眼睛学数理化
# 算法:模拟/贪心
# 代码看不懂的地方,请直接在群上提问# 计算从左边空地出发,能够攀登并按照原路返回的山峰数量
def cal_peak_from_left(nums, power_max, n):ans = list()# 记录出发空地的坐标space_list = list()# 考虑所有位置,记录出发的起始位置空地for i in range(n-1):# 如果i为空地,且下一个位置i+1不为空地,则记录位置i,作为一个出发的空地# (即如果出现连续的空地,只需要储存最右边最靠近山体的空地作为出发的起始位置即可)if nums[i] == 0 and nums[i+1] > 0:space_list.append(i)# 考虑每一个起始位置for start in space_list:# 设置初始的i为空地start的下一个位置i = start + 1route_num = 0# 从start+1出发,向右登山# 且不能跨过所有山脉爬到另一头的另一个空地while i < n and nums[i] != 0:# 总高度差新增nums[i]和nums[i-1]之间的高度差route_num += abs(nums[i] - nums[i-1])# 若当前花费体力大于最大体力值,则无法攀登到最新的i处,退出循环# 注意:这里是大于等于,不是大于if route_num * 3 >= power_max:break# 若nums[i]是一座山峰,把i存入ans中# 边界情况if i == n-1 and nums[i] > nums[i-1]:ans.append(i)# 非边界情况elif nums[i] > nums[i-1] and nums[i] > nums[i+1]:ans.append(i)# i递增i += 1# 返回所有能够到达的山峰的索引return ans# 输入高度数组
heights = list(map(int, input().split(",")))
# 获得数组长度
n = len(heights)
# 输入最大体力
power_max = int(input())
# 计算从左边空地出发,向右攀爬,并原路返回能到达的山峰
ans_from_left = cal_peak_from_left(heights, power_max, n)
# 计算从右边空地出发,向左攀爬,并原路返回能到达的山峰
ans_from_right = cal_peak_from_left(heights[::-1], power_max, n)
# 由于使用了反转,得到的索引也是反转的,需要进一步处理才能得到原heights数组中的索引
ans_from_right = [n-i-1 for i in ans_from_right]
# 求ans_from_left和ans_from_right的交集的长度(去重),即为答案
ans = len(set(ans_from_left + ans_from_right))
print(ans)

java

import java.util.*;public class Main {// 计算从左边空地出发,能够攀登并按照原路返回的山峰数量public static List<Integer> calPeakFromLeft(List<Integer> nums, int powerMax, int n) {List<Integer> ans = new ArrayList<>();List<Integer> spaceList = new ArrayList<>();// 记录出发空地的坐标for (int i = 0; i < n - 1; i++) {// 如果i为空地,且下一个位置i+1不为空地,则记录位置i,作为一个出发的空地// (即如果出现连续的空地,只需要储存最右边最靠近山体的空地作为出发的起始位置即可)if (nums.get(i) == 0 && nums.get(i + 1) > 0) {spaceList.add(i);}}// 考虑每一个起始位置for (int start : spaceList) {// 设置初始的i为空地start的下一个位置int i = start + 1;int routeNum = 0;// 从start+1出发,向右登山// 且不能跨过所有山脉爬到另一头的另一个空地while (i < n && nums.get(i) != 0) {// 总高度差新增nums[i]和nums[i-1]之间的高度差routeNum += Math.abs(nums.get(i) - nums.get(i - 1));// 若总高度大于等于最大高度差,则无法攀登到最新的i处,退出循环// 注意:这里是大于等于,不是大于if (routeNum * 3 >= powerMax) {break;}// 若nums[i]是一座山峰,把i存入ans中// 边界情况if (i == n - 1 && nums.get(i) > nums.get(i - 1)) {ans.add(i);}// 非边界情况else if (nums.get(i) > nums.get(i - 1) && nums.get(i) > nums.get(i + 1)) {ans.add(i);}// i递增i++;}}// 返回所有能够到达的山峰的索引return ans;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();List<Integer> heights = new ArrayList<>();String[] heightStrings = input.split(",");for (String heightString : heightStrings) {heights.add(Integer.parseInt(heightString));}int n = heights.size();int powerMax = scanner.nextInt();// 计算从左边空地出发,向右攀爬,并原路返回能到达的山峰List<Integer> ansFromLeft = calPeakFromLeft(heights, powerMax, n);// 计算从右边空地出发,向左攀爬,并原路返回能到达的山峰List<Integer> reversedHeights = new ArrayList<>(heights);Collections.reverse(reversedHeights);List<Integer> ansFromRight = calPeakFromLeft(reversedHeights, powerMax, n);// 由于使用了反转,得到的索引也是反转的,需要进一步处理才能得到原heights数组中的索引for (int i = 0; i < ansFromRight.size(); i++) {ansFromRight.set(i, n - ansFromRight.get(i) - 1);}// 使用 HashSet 来存储并集的结果,去重Set<Integer> ansSet = new HashSet<>(ansFromLeft);ansSet.addAll(ansFromRight);// 输出结果System.out.println(ansSet.size());}
}

cpp

#include <iostream>
#include <vector>
#include <cmath>
#include <unordered_set>
#include <sstream>using namespace std;// 计算从左边空地出发,能够攀登并按照原路返回的山峰数量
vector<int> cal_peak_from_left(vector<int>& nums, int power_max, int n) {vector<int> ans;vector<int> space_list;// 记录出发空地的坐标for (int i = 0; i < n - 1; i++) {// 如果i为空地,且下一个位置i+1不为空地,则记录位置i,作为一个出发的空地// (即如果出现连续的空地,只需要储存最右边最靠近山体的空地作为出发的起始位置即可)if (nums[i] == 0 && nums[i+1] > 0) {space_list.push_back(i);}}// 考虑每一个起始位置for (int start : space_list) {// 设置初始的i为空地start的下一个位置int i = start + 1;int route_num = 0;// 从start+1出发,向右登山// 且不能跨过所有山脉爬到另一头的另一个空地while (i < n && nums[i] != 0) {// 总高度差新增nums[i]和nums[i-1]之间的高度差route_num += abs(nums[i] - nums[i - 1]);// 若总高度大于等于最大高度差,则无法攀登到最新的i处,退出循环// 注意:这里是大于等于,不是大于if (route_num * 3 >= power_max) {break;}// 若nums[i]是一座山峰,把i存入ans中// 边界情况if (i == n - 1 && nums[i] > nums[i - 1]) {ans.push_back(i);}// 非边界情况else if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) {ans.push_back(i);}// i递增i++;}}// 返回所有能够到达的山峰的索引return ans;
}int main() {string input;getline(cin, input);vector<int> heights;int num, power_max;// 使用 stringstream 解析输入高度数组stringstream ss(input);string temp;while (getline(ss, temp, ',')) {num = stoi(temp);heights.push_back(num);}// 获得数组长度int n = heights.size();// 输入最大体力cin >> power_max;// 计算从左边空地出发,向右攀爬,并原路返回能到达的山峰vector<int> ans_from_left = cal_peak_from_left(heights, power_max, n);// 计算从右边空地出发,向左攀爬,并原路返回能到达的山峰vector<int> reversed_heights(heights.rbegin(), heights.rend());vector<int> ans_from_right = cal_peak_from_left(reversed_heights, power_max, n);// 由于使用了反转,得到的索引也是反转的,需要进一步处理才能得到原heights数组中的索引for (int i = 0; i < ans_from_right.size(); i++) {ans_from_right[i] = n - ans_from_right[i] - 1;}// 使用 unordered_set 来存储交集的结果,去重unordered_set<int> ans_set;for (int val : ans_from_left) {ans_set.insert(val);}for (int val : ans_from_right) {ans_set.insert(val);}// 输出结果cout << ans_set.size() << endl;return 0;
}

时空复杂度

时间复杂度:O(N)

空间复杂度:O(N)


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务300+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

流畅的Python(二十一)-类元编程

一、核心要义 1.类元编程时指在运行时创建或定制类的技艺 2.类是一等对象,因此任何时候都可以使用函数新建类&#xff0c;而无需使用class关键字 3.类装饰器也是函数&#xff0c;不过能够审查、修改&#xff0c;甚至把被装饰的类替换为其它类。 4.元类(type类的子类)类编程…

内网渗透学习-环境搭建

1、环境搭建测试 虚拟机网络环境配置&#xff0c;模拟外网和内网 主机操作系统网络内网ip外网ip物理主机window10vmnet8192.168.70.1攻击机kali Linuxvmnet8192.168.70.134域控主机win server 2008 r2vmnet0192.168.52.138域成员主机win server 2k3vmnet0192.168.52.141服务器…

HarmonyOS NEXT应用开发之swiper指示器导航点位于swiper下方

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区域。…

【数据结构】链表力扣刷题详解

前言 题目链接 移除链表元素 链表的中间结点 反转链表 分割链表 环形链表的约瑟夫问题 ​ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 移除链表元素 题述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请…

【Spring Cloud Gateway】路由配置uri三种方式及区别

websocket配置方式 ws:// 或 wss:// 开头的 URI&#xff0c;表示配置的是支持 Websocket 协议的目标地址。 这种方式适用于需要与客户端建立长连接、实现双向通信的场景&#xff0c;比如实时消息推送、即时聊天等。 使用 Websocket 配置方式可以让 Spring Cloud Gateway 能够…

代理IP品质对Tik Tok代理的重要性

随着Tik Tok的迅速崛起&#xff0c;越来越多的人开始关注如何透过Tik Tok进行行销和推广。其中&#xff0c;使用Tik Tok代理程式是常见的方法。 然而&#xff0c;在选择和使用代理时&#xff0c;IP品质是一个不可忽视的因素。本文将探讨IP品质对Tik Tok代理的重要性&#xff0…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridRow)

栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本…

初中分班怎么分按什么标准

初中是学生生涯中一个重要的阶段&#xff0c;它承接着小学的基础教育&#xff0c;同时为高中的深入学习打下基础。在这个关键时期&#xff0c;分班成为学校、家长和学生共同关注的焦点。那么&#xff0c;初中分班是按照什么标准来进行的呢&#xff1f; 学业成绩是初中分班的首要…

考研复习C语言进阶(4)

1. 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的方式有两个特点&#xff1a; 1. 空间开辟大小是固定的。 2. 数组在申明的时候&#…

Docker知识--01

虚拟化 # 什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打…

深度学习模型参数的计算

1. 模型尺寸与参数量 根据神经网络模型中的参数数量估计模型体积的大小涉及多个考虑因素&#xff0c;包括参数的数据类型、每种数据类型的存储要求以及存储模型结构或元数据的任何额外开销。下面是估计模型大小的一般方法&#xff1a; 1.1.数据类型 神经网络参数通常存储为浮…

Vue3使用高德地图(3分钟快速上手)

一.、在高德开发平台注册账号 高德开放平台 | 高德地图API (amap.com) 二、我的 > 管理管理中添加Key 三、安装依赖 npm i amap/amap-jsapi-loader --save 四、创建一个放置地图的容器 <template><div class"container"></div> </template…

网工内推 | 信息安全主管,CISP认证优先,最高25K,加绩效提成

01 福建省数字福建云计算运营有限公司 招聘岗位&#xff1a;网络及信息安全主管 职责描述&#xff1a; 1.负责带领IT运维团队&#xff0c;对公司网络与安全整体架构规划&#xff0c;设计、运营及IT设备的全生命周期运维规划等&#xff1b; 2.负责对网络、网络安全的日常运维管…

C++中虚表是什么

定义 虚函数&#xff08;Virtual Function&#xff09; 定义&#xff1a;类中使用virtual 关键字修饰的函数 叫做虚函数 语法&#xff1a; class Base { public:virtual void show() { cout << "Base show" << endl; } }; 虚函数表&#xff08;Virtual…

印刷企业实施MES管理系统如何做好需求分析

在数字化、信息化的大潮中&#xff0c;印刷企业面临着转型升级的迫切需求。MES管理系统作为连接企业资源计划ERP和现场自动化系统的桥梁&#xff0c;对于提升印刷企业的生产效率、优化资源配置、提高产品质量具有重要意义。因此&#xff0c;做好MES管理系统的需求分析&#xff…

多线程(部分)

Day28下2 多线程 一、什么是进程 进程是系统进行资源分配和调用的独立单元&#xff0c;每一个进程都有它的独立内存空间和系统资源。 二、单进程操作系统和多进程操作系统的区别 单进程操作系统&#xff1a;dos&#xff08;一瞬间只能执行一个任务&#xff09; 多进程单用户操…

equals与时间序列攻击

引言 随着信息技术的迅速发展&#xff0c;网络安全和隐私问题变得愈发重要。黑客和攻击者不断寻找新的攻击方法&#xff0c;其中之一是时间序列攻击&#xff08;Timing Attack&#xff09;。时间序列攻击是一种侧信道攻击&#xff0c;攻击者试图通过测量程序的执行时间来推断程…

Vue3语法插件Volar在vsCode中搜不到,Volar正式更名为Vue-Official

问题描述 今天拿Vue3的cli练手&#xff0c;之前用的语法插件是Vue2的Vetur&#xff0c;对于Vue3来说该插件不能完美匹配了&#xff0c;所以就想切换回Volar&#xff0c;结果万万没想到&#xff0c;找不着了&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01;&…

git stash clear/drop 后如何恢复

git stash clear/drop 后代码如何恢复 事故经过 切换分支前有修改未提交的代码&#xff0c;使用 git stash 存储了当前的代码切换分支再返回自己开发的分支本来要进行 git stash pop 操作&#xff0c;然后 git stash list 发现有好几个 stash记录于是想清除没用的 stash 记录…

【Linux】进程优先级 命令行参数 环境变量

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、进程优先级 1.1、进程优先级的基本概念 1.2、优先级 VS 权限 1.3、为什么要有优先级&#xff1f; 1.4、Linux的优先级的特点 && 查看方式 1.…