当前位置: 首页 > news >正文

代码详解:2024美团春招实习笔试第一场0309,是难还是简单?

前言:

1.第一题(模拟)

2.第二题(模拟)

3.第三题(二维前缀和)

4.第四题的思维(双指针)

5.第五题难度比较大(并查集+删边+离散化)

一.小美的MT

MT 是美团的缩写,因此小美很喜欢这两个字母。

现在小美拿到了一个仅由大写字母组成字符串,她可以最多操作k次,每次可以修改任意一个字符。小美想知道,操作结束后最多共有多少个'M'和'T'字符?

输入描述

第一行输入两个正整数n,k,代表字符串长度和操作次数。第二行输入一个长度为n的、仅由大写字母组成的字符串。1<=k<=n<=10^5

输出描述

输出操作结束后最多共有多少个'M'和'T'字符。

示例 1

输入

5 2
MTUAN

输出

4

说明

修改第三个和第五个字符,形成的字符串为 MTTAM,这样共有 4 个'M'和'T'。

思路与代码

1.首先统计字符串中除了M和T以外的字符的个数,记为add。

2.操作次数为k,因此最多可以min(k,add)将个字符变为M和T

3.再加上之前的M和T字符的个数。

4.结果为n-add+min(k,add);

C++:

#include <bits/stdc++.h>
using namespace std;
int main() {int n, k, sum = 0;cin >> n >> k;string s;cin >> s;int add = 0;for (int i = 0; i < s.size(); i++) {if (s[i] != 'M' && s[i] != 'T') {add++;}}sum = n - add + min(k, add);cout << sum << "\n";return 0;
}

Java:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n, k, sum = 0;n = scanner.nextInt();k = scanner.nextInt();String s = scanner.next();int add = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) != 'M' && s.charAt(i) != 'T') {add++;}}sum = n - add + Math.min(k, add);System.out.println(sum);}
}

二.小美的数组询问

小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。

现在小美想知道,如果那些未知的元素在区间[l,r]范围内随机取值的话,数组所有元素之和的最小值和最大值分别是多少?

共有q次询问。

输入描述

第一行输入两个正整数n,q,代表数组大小和询问次数。

第二行输入n个整数ai,其中如果输入ai的为 0,那么说明ai是未知的。

接下来的q行,每行输入两个正整数l,r,代表一次询问。

1<=n,q<=10^5
0<=ai<=10^9
1<=l<=r<=10^9

输出描述

输出q行,每行输出两个正整数,代表所有元素之和的最小值和最大值。

示例 1

输入

3 2
1 0 3
1 2
4 4

输出

5 6
8 8

说明

只有第二个元素是未知的。
第一次询问,数组最小的和是 1+1=3=5,最大的和是 1+2+3=6。
第二次询问,显然数组的元素和必然为 8。

思路与代码

1.循环一遍,sum记录非0的情况下的和,res统计0的数量。

2.最小值就是0的数量 * 区间左值(res*l),反之最大值就是0的数量*区间右值(res*r)。

3.答案就是最小:sum+res*l,最大:sum+res*r;

C++

#include <bits/stdc++.h>
using namespace std;int main() {int n, q;cin >> n >> q;vector<int> a(n);for (int i = 0; i < n; i++) {cin >> a[i];}int res = 0;int sum = 0;for (int i = 0; i < n; i++) {if (a[i] == 0) {res++;}sum += a[i];}for (int i = 0; i < q; i++) {int l, r;cin >> l >> r;cout << sum + res *l << " " << sum + res *r << endl;}return 0;
}

Java

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int q = sc.nextInt();int[] a = new int[n];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}int res = 0;int sum = 0;for (int i = 0; i < n; i++) {if (a[i] == 0) {res++;}sum += a[i];}for (int i = 0; i < q; i++) {int l = sc.nextInt();int r = sc.nextInt();System.out.println((sum + res * l) + " " + (sum + res * r));}}
}

三.小美的平衡矩阵

小美拿到了一个n*n 的矩阵,其中每个元素是 0 或者 1。

小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。

现在,小美希望你回答有多少个i*i的完美矩形区域。你需要回答1<=i<=n的所有答案。

输入描述

第一行输入一个正整数n,代表矩阵大小。

接下来的n行,每行输入一个长度为n的01 串,用来表示矩阵。

输出描述

输出n行,第i行输出的i*i完美矩形区域的数量。

示例 1

输入

4
1010
0101
1100
0011

输出

0
7
0
1

思路与代码

二维前缀和。n<=200.所以可以n^3进行解决题目

1.枚举所有的边长i的正方形.

2.如果0和1的数量各一半,那么就是判断正方形的和是否为i*i / 2,如果是就++。

3.计算时:

第一层循环枚举矩形长度i,

第二,三层循环分别枚举矩形的左上角的端点(x,y)

对应右下角的端点则为(x+i-1,y+i-1)

C++:

#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int n;
char a[N][N];
int s[N][N];
int main() {cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> a[i][j];}}for (int i = 1; i <= n; i ++ )for (int j = 1; j <= n; j ++ )s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + (a[i][j] == '1');for (int i = 1; i <= n; i++) {int cnt = 0;for (int x = 1; x <= n - i + 1; x++) {for (int y = 1; y <= n - i + 1; y++) {int sum = s[x + i - 1][y + i - 1] - s[x + i - 1][y - 1] - s[x - 1][y + i - 1] + s[x - 1][y - 1];if (sum * 2 == i * i) {cnt++;}}}cout << cnt << endl;}return 0;
}

Java:


import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int N = 510;int n = scanner.nextInt();char[][] a = new char[N][N];int[][] s = new int[N][N];for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {a[i][j] = scanner.next().charAt(0);}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + (a[i][j] == '1' ? 1 : 0);}}for (int i = 1; i <= n; i++) {int cnt = 0;for (int x = 1; x <= n - i + 1; x++) {for (int y = 1; y <= n - i + 1; y++) {int sum = s[x + i - 1][y + i - 1] - s[x + i - 1][y - 1] - s[x - 1][y + i - 1] + s[x - 1][y - 1];if (sum * 2 == i * i) {cnt++;}}}System.out.println(cnt);}}
}

四.小美的区间删除

小美拿到了一个大小为n的数组,她希望删除一个区间后,使得剩余所有元素的乘积末尾至少有k个 0。小美想知道,一共有多少种不同的删除方案?

输入描述

第一行输入两个正整数n,k。第二行输入n个正整数ai,代表小美拿到的数组。

1<=n,k<=10^5
1<=ai<=10^9

输出描述

一个整数,代表删除的方案数。

示例 1

输入

5 2
2 5 3 4 20

输出

4

说明

第一个方案,删除[3]。
第二个方案,删除[4]。
第三个方案,删除[3,4]。
第四个方案,删除[2]。

思路与代码

2和5的因子个数。2*5=10;2^i*5^j == min(i,j)==0的数量 2*5=10

使用双指针

区间的一个长度越大,那么末尾0的个数越多,单调性,

使用双指针

1.我们首先统计整个数组的2和5的因子3数量,和每个元素对应的5的因子数量。

2.维护2个指针l,r

3.如果l,r的区间min(cnt2,cnt5)>=k,我们答案就累加l-r+1;

C++:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a2[N], a5[N];
int cnt2 = 0, cnt5 = 0;
int n, k, x;void cnt2_cnt5_count() {for (int i = 0; i < n; i ++) {cin >> x;while (x % 2 == 0) {a2[i] ++;x /= 2;cnt2 ++;}while (x % 5 == 0) {a5[i] ++;x /= 5;cnt5 ++;}}
}int main() {cin >> n >> k;cnt2_cnt5_count();int l = 0;long long res = 0;for (int r = 0; r < n; r ++) {cnt2 -= a2[r];cnt5 -= a5[r];while (min(cnt2, cnt5) < k && l <= r) {cnt2 += a2[l];cnt5 += a5[l];l ++;}res += (long long)(r - l + 1);}cout << res << endl;return 0;
}

Java:

import java.util.Scanner;public class Main {static final int N = 1000010;static int[] a2 = new int[N];static int[] a5 = new int[N];static int cnt2 = 0, cnt5 = 0;static int n, k, x;public static void cnt2Cnt5Count() {Scanner input = new Scanner(System.in);for (int i = 0; i < n; i++) {x = input.nextInt();while (x % 2 == 0) {a2[i]++;x /= 2;cnt2++;}while (x % 5 == 0) {a5[i]++;x /= 5;cnt5++;}}}public static void main(String[] args) {Scanner input = new Scanner(System.in);n = input.nextInt();k = input.nextInt();cnt2Cnt5Count();int l = 0;long res = 0;for (int r = 0; r < n; r++) {cnt2 -= a2[r];cnt5 -= a5[r];while (Math.min(cnt2, cnt5) < k && l <= r) {cnt2 += a2[l];cnt5 += a5[l];l++;}res += (long) (r - l + 1);}System.out.println(res);}
}

五.小美的朋友关系

小美认为,在人际交往中,但是随着时间的流逝,朋友的关系也是会慢慢变淡的,最终朋友关系就淡忘了。

现在初始有一些朋友关系,存在一些事件会导致两个人淡忘了他们的朋友关系。小美想知道某一时刻中,某两人是否可以通过朋友介绍互相认识?

事件共有 2 种:

1 u v:代表编号 u 的人和编号 v 的人淡忘了他们的朋友关系。

2 u v:代表小美查询编号 u 的人和编号 v 的人是否能通过朋友介绍互相认识。

注:介绍可以有多层,比如 2 号把 1 号介绍给 3 号,然后 3 号再把 1 号介绍给 4 号,这样 1 号和 4 号就认识了。

输入描述

第一行输入三个正整数n,m,q,代表总人数,初始的朋友关系数量,发生的事件数量。接下来的m行,每行输入两个正整数u,v,代表初始编号u的人和编号v的人是朋友关系。接下来的q行,每行输入三个正整数op,u,v,含义如题目描述所述。

1<=n <= 10^9
1<= m,q<= 10^5
1<= u,v<= n
1<= op <= 2
保证至少存在一次查询操作。

输出描述

对于每次 2 号操作,输出一行字符串代表查询的答案。如果编号 u 的人和编号 v 的人能通过朋友介绍互相认识,则输出"Yes"。否则输出"No"。

示例 1

输入

5 3 5
1 2
2 3
4 5
1 1 5
2 1 3
2 1 4
1 1 2
2 1 3

输出

Yes
No
No

说明

第一次事件,1 号和 5 号本来就不是朋友,所以无事发生。

第二次事件是询问,1 号和 3 号可以通过 2 号的介绍认识。

第三次事件是询问,显然 1 号和 4 号无法互相认识。

第四次事件,1 号和 2 号淡忘了。

第五次事件,此时 1 号无法再经过 2 号和 3 号互相认识了。

思路与代码

离线处理数据(map)+并查集+逆向思维。

1.离线处理,因为这里的n非常大1e9,后面是使用并查集构造n个节点,father数组肯定装不下.

2.并查集处理加边,删边转换下思路

3.如果我们已经找出所有可能要删除的边,然后假设所有边都删除了,构建一个最终的并查集(这个并查集并不影响后面的删边的情况)。

4.逆向遍历所有的q次操作,如果是查询(1操作),使用并查集直接查出即可;如果是删除(2操作),则往并查集添加边。

C++:

#include <bits/stdc++.h>
using namespace std;unordered_map<int, int> father;
int find(int x) {return father[x] == x ? x : (father[x] = find(father[x]));
}void merge(int x, int y) {int i = find(x), j = find(y);if (i != j)father[i] = j;
}struct node {int op;int u;int v;
};int main() {int n, m, p;cin >> n >> m >> p;vector<node> all(p);set<pair<int, int> > q;set<pair<int, int> > q_del;for (int i = 0; i < m; i ++) {int u, v;cin >> u >> v;father[u] = u;father[v] = v;q.insert({u, v});//初始化需要建立的边}for (int i = 0; i < p; i ++) {cin >> all[i].op >> all[i].u >> all[i].v;father[all[i].u] = all[i].u;father[all[i].v] = all[i].v;if (all[i].op == 1) {q_del.insert({all[i].u, all[i].v});//需要删除的边}}for (auto e : q_del) {int u = e.first, v = e.second;if (q.count({u, v}) || q.count({v, u})) {q.erase(e);}}for (auto e : q) {merge(e.first, e.second);}vector<string> res;for (int i = p - 1; i >= 0; i --) {if (all[i].op == 1) {merge(all[i].u, all[i].v);} else {if (find(all[i].u) == find(all[i].v)) {res.push_back("Yes");} else {res.push_back("No");}}}reverse(res.begin(), res.end());for (string s : res) {cout << s << endl;}return 0;
}

Java:

import java.util.*;class Main {static Map<Integer, Integer> father;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m = scanner.nextInt();int p = scanner.nextInt();father = new HashMap<>();List<Node> all = new ArrayList<>();Set<Pair> q = new HashSet<>();Set<Pair> q_del = new HashSet<>();for (int i = 0; i < m; i++) {int u = scanner.nextInt();int v = scanner.nextInt();father.put(u, u);father.put(v, v);q.add(new Pair(u, v)); // 初始化需要建立的边}for (int i = 0; i < p; i++) {int op = scanner.nextInt();int u = scanner.nextInt();int v = scanner.nextInt();all.add(new Node(op, u, v));father.put(u, u);father.put(v, v);if (op == 1) {q_del.add(new Pair(u, v)); // 需要删除的边}}for (Pair e : q_del) {int u = e.first, v = e.second;if (q.contains(new Pair(u, v)) || q.contains(new Pair(v, u))) {q.remove(e);}}for (Pair e : q) {merge(e.first, e.second);}List<String> res = new ArrayList<>();for (int i = p - 1; i >= 0; i--) {if (all.get(i).op == 1) {merge(all.get(i).u, all.get(i).v);} else {if (find(all.get(i).u) == find(all.get(i).v)) {res.add("Yes");} else {res.add("No");}}}Collections.reverse(res);for (String s : res) {System.out.println(s);}}static int find(int x) {return father.get(x) == x ? x : find(father.get(x));}static void merge(int x, int y) {int i = find(x);int j = find(y);if (i != j) {father.put(i, j);}}static class Node {int op;int u;int v;Node(int op, int u, int v) {this.op = op;this.u = u;this.v = v;}}static class Pair {int first;int second;Pair(int first, int second) {this.first = first;this.second = second;}@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Pair pair = (Pair) obj;return first == pair.first && second == pair.second;}@Overridepublic int hashCode() {return Objects.hash(first, second);}}
}

最后:

觉得讲解不错的可以关注,反响不错的话,会更新此系列讲解视频,最后的最后祝大家offer满满!!!


 

相关文章:

代码详解:2024美团春招实习笔试第一场0309,是难还是简单?

前言: 1.第一题&#xff08;模拟&#xff09; 2.第二题&#xff08;模拟&#xff09; 3.第三题&#xff08;二维前缀和&#xff09; 4.第四题的思维&#xff08;双指针&#xff09; 5.第五题难度比较大&#xff08;并查集删边离散化&#xff09; 一.小美的MT MT 是美团的…...

平衡二叉树

前言 在关键字排列随机的情况下&#xff0c;二叉排序树的平均查找长度和 l o g n log n logn是等数量级的。在某些情况下&#xff0c;尚需在构成二叉排序树的过程中进行“平衡化”处理&#xff0c;使其成为平衡二叉树。 如果任何初始化序列构成的二叉排序树都是平衡二叉树&…...

脚本自动化 设置快捷方式并设置为管理员运行

自动化创建快捷方式并设置为始终以管理员权限运行&#xff0c;可以通过编写批处理脚本来实现。以下是一个创建.bat批处理文件快捷方式并设置为管理员运行的示例脚本&#xff1a; batch echo off set SCRIPT_PATH"C:\Scripts\myScript.bat" set SHORTCUT_PATH"%…...

TypeScript学习笔记(上):TypeScript的介绍、安装及常用类型

我对TypeScript的理解就是&#xff0c;TypeScript是增加了类型校验的JavaScript&#xff0c;能够把运行期错误提升至编译期 目录 TypeScript是什么&#xff1f; 安装编译 TS 的工具包 运行 TS 的步骤 TypeScript 常用类型 JS 已有类型 TS 新增类型 简单数据类型 数组类…...

Vue3学习记录(六)--- 组合式API之依赖注入和异步组件

一、依赖注入 1、简介 ​ 在前面的笔记中&#xff0c;我们学习过父组件向子组件传递数据时&#xff0c;需要借助props来实现。但如果父组件想要向孙子组件传递数据&#xff0c;那就要连续使用两层props逐级向下传递&#xff0c;如果要接收数据的是更深层的后代组件&#xff0…...

JZ76 删除链表中重复的结点

/*public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} } */import java.util.*; public class Solution {public ListNode deleteDuplication(ListNode pHead) {//初步想想法&#xff1a; 弄一个hashmap 然后进行key存储起来。然后 如果存…...

20.2 nginx

20.2 nginx 1. 学习目标2. 介绍2.1 正向代理2.2 反向代理2.3 动态静态资源分离2.4 nginx优缺点3. 安装3.1 Linux安装****************************************************************************************************************************************************…...

MySQL学习Day26——事务基础知识

一、数据库事务概述: 事务是数据库区别于文件系统的重要特性之一,事务会让数据始终保持一致性,能通过事务机制恢复到某个时间点,可以保证提交到数据库的修改不会因为系统崩溃而丢失 1.查看引擎支持事务的情况:只有InnoDB存储引擎支持事务 SHOW ENGINES; 2.基本概念: 事…...

three.js 射线Ray,三维空间中绘制线框

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div> <div>{{ res1 }}</div> <div>{{ res2 }}</div><…...

【Demo】游戏小地图

简介 该Demo基于2D关卡随机生成项目进行实现&#xff0c;旨在初步探索游戏小地图的制作。 演示 MiniMapDemo 资源下载 百度网盘&#xff08;提取码&#xff1a;1314&#xff09; 如果这篇文章对你有帮助&#xff0c;请给作者点个赞吧&#xff01;...

代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II

62.不同路径 每一位的结果等于上方与左侧结果和 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector(n,0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; …...

Qt中parent()函数的使用

情景(需求)抽象&#xff1a; A类对象是B类对象的成员变量。 B类对象是A类对象的父亲。 A类对象中包含按钮&#xff0c;点击按钮&#xff0c;调用B类的成员函数。 示例&#xff1a; A类&#xff1a; #pragma once#include <QWidget> #include "ui_QtWidgetsCla…...

Python基础学习(5)流程控制

文章目录 一. 程序三大执行流程二. 分支结构1.单分支结构(if)2.双分支结构(if..else)3.多分支结构(if..elif..else) 二,缩进(tab键)三,循环结构1.while循环2.for循环①遍历字典 五.break&#xff0c;continue和pass语句1.break&#xff0c;continue2.pass Python基础学习(1)基本…...

代码随想录刷题笔记 DAY 42 | 最后一块石头的重量 II No.1049 | 目标和 No.494 | 一和零 No.474

文章目录 Day 4301. 最后一块石头的重量 II&#xff08;No. 1049&#xff09;<1> 题目<2> 笔记<3> 代码 02. 目标和&#xff08;No. 494&#xff09;<1> 题目<2> 笔记<3> 代码 03. 一和零&#xff08;No. 474&#xff09;<1> 题目&l…...

793.高精度乘法(acwing)

文章目录 793.高精度乘法题目描述高精度乘法 793.高精度乘法 题目描述 给定两个正整数A和B&#xff0c;请你计算A * B的值。 输入格式 共两行&#xff0c;第一行包含整数A&#xff0c;第二行包含整数B。 输出格式 共一行&#xff0c;包含A * B的值。 数据范围 1≤A的长度≤…...

考研经验|如何从考研失败中走出来?

对我来说&#xff0c;太丢人了 其实我在本科的时候在同学眼中&#xff0c;一直很优秀&#xff0c;每年奖学金必有我的&#xff0c;国家励志奖学金&#xff0c;国家奖学金&#xff0c;这种非常难拿的奖学金&#xff0c;我也拿过&#xff0c;本科期间学校有一个公费去新西兰留学的…...

SpringBoot如何修改pom依赖的默认版本号

1、找到SpringBoot父工程依赖。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.5.RELEASE</version> </parent>2、ctrl 鼠标左键点击<artifact…...

UDP与TCP:了解这两种网络协议的不同之处

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

String、StringBuffer基本用法

一、StringBuffer基本用法 1.append():字符串连接操作 StringBuffer sb new StringBuffer();sb.append("a");sb.append("b");sb.append("c");sb.append("哈哈").append("d");System.out.println(sb);2.insert():在任意位…...

蓝桥杯刷题5--GCD和LCM

目录 1. GCD 1.1 性质 1.2 代码实现 2. LCM 2.1 代码实现 3. 习题 3.1 等差数列 3.2 Hankson的趣味题 3.3 最大比例 3.4 GCD 1. GCD 整数a和b的最大公约数是能同时整除a和b的最大整数&#xff0c;记为gcd(a, b) 1.1 性质 GCD有关的题目一般会考核GCD的性质。   …...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...