【2024年华为OD机试】(A卷,100分)- 等和子数组最小和(Java JS PythonC/C++)
一、问题描述
题目描述
给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。
输入描述
第一行输入 m
接着输入m个数,表示此数组nums
数据范围:1<=m<=50, 1<=nums[i]<=50
输出描述
最小拆分数组和
用例
输入
7
4 3 2 3 5 2 1
输出
5
说明
可以等分的情况有:
- 4 个子集(5),(1,4),(2,3),(2,3)
- 2 个子集(5, 1, 4),(2,3, 2,3)
但最小的为5。
题目解析
本题算是划分为k个相等的子集的变种题,本题同样是要将数组划分为k个和相等的子集。
本题要我们求解:最小拆分数组和,其实就是求解:最小子集和,其实就是求解,最大k值。因为k值越大,则对应的子集的和越小。
这里k的求解很简单,首先,我们可以猜想下k的上限是多少?
比如数组所有元素都相等,则k === m,即每个元素都能作为一个子集,因此我们可以让k从m开始尝试,如果不行,则k–,直到k=1。
而验证nums是否可以划分为k层,其实就是判断nums是否可以划分为k个和相等的子集,这个判断逻辑可以复用划分为k个相等的子集中的逻辑。
二、JavaScript算法源码
以下是对提供的 JavaScript 代码的中文详细注释和逻辑讲解:
JavaScript 代码实现
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");// 创建 readline 接口,用于从控制台读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 存储输入行的数组
const lines = [];// 监听每一行输入
rl.on("line", (line) => {lines.push(line); // 将输入行存入 lines 数组// 当输入行数为 2 时,表示输入完成if (lines.length === 2) {const m = parseInt(lines[0]); // 解析第一行输入,获取 m 的值const arr = lines[1].split(" ").map(Number); // 解析第二行输入,获取数组 arr// 调用 getResult 函数计算结果并输出console.log(getResult(arr, m));// 清空 lines 数组,准备接收下一组输入lines.length = 0;}
});/*** 计算将数组划分为 m 个子集的最大子集和* @param {number[]} arr - 输入的数组* @param {number} m - 子集的数量* @returns {number} - 最大子集和*/
function getResult(arr, m) {// 对数组进行降序排序const sum = arr.sort((a, b) => b - a).reduce((p, c) => p + c);// 从 m 开始递减,尝试将数组划分为 m 个子集while (m) {// 如果可以将数组划分为 m 个子集,返回子集和if (canPartitionMSubsets([...arr], sum, m)) return sum / m;m--;}// 如果无法划分,返回数组总和return sum;
}/*** 判断是否可以将数组划分为 m 个子集,每个子集的和为 subSum* @param {number[]} arr - 输入的数组* @param {number} sum - 数组的总和* @param {number} m - 子集的数量* @returns {boolean} - 是否可以划分*/
function canPartitionMSubsets(arr, sum, m) {// 如果总和不能被 m 整除,无法划分if (sum % m !== 0) return false;// 计算每个子集的目标和const subSum = sum / m;// 如果数组中的最大值大于目标和,无法划分if (subSum < arr[0]) return false;// 如果数组中的某个元素等于目标和,直接将其作为一个子集while (arr[0] === subSum) {arr.shift(); // 移除该元素m--; // 减少子集数量}// 初始化 m 个桶,用于存储每个子集的当前和const buckets = new Array(m).fill(0);// 调用 partition 函数进行递归划分return partition(arr, 0, buckets, subSum);
}/*** 递归尝试将数组划分为 m 个子集* @param {number[]} arr - 输入的数组* @param {number} index - 当前处理的数组索引* @param {number[]} buckets - 存储每个子集当前和的数组* @param {number} subSum - 每个子集的目标和* @returns {boolean} - 是否可以划分*/
function partition(arr, index, buckets, subSum) {// 如果所有元素都已处理,返回 trueif (index === arr.length) return true;// 获取当前处理的元素const select = arr[index];// 尝试将当前元素放入每个桶中for (let i = 0; i < buckets.length; i++) {// 如果当前桶和前一个桶的和相同,跳过(避免重复计算)if (i > 0 && buckets[i] === buckets[i - 1]) continue;// 如果当前元素可以放入当前桶if (select + buckets[i] <= subSum) {buckets[i] += select; // 将当前元素放入桶中// 递归处理下一个元素if (partition(arr, index + 1, buckets, subSum)) return true;buckets[i] -= select; // 回溯:将当前元素从桶中移除}}// 如果无法放入任何桶,返回 falsereturn false;
}
代码讲解
1. 输入处理
- 使用
readline
模块从控制台读取输入。 - 将输入的两行数据分别解析为
m
(子集数量)和arr
(数组)。 - 当输入完成后,调用
getResult
函数计算结果并输出。
2. 主逻辑:getResult
函数
- 对数组进行降序排序,并计算数组的总和
sum
。 - 从
m
开始递减,尝试将数组划分为m
个子集。 - 如果成功划分,返回子集和
sum / m
;否则返回数组总和sum
。
3. 判断是否可以划分:canPartitionMSubsets
函数
- 检查总和
sum
是否能被m
整除,如果不能,直接返回false
。 - 计算每个子集的目标和
subSum
。 - 如果数组中的最大值大于
subSum
,无法划分,返回false
。 - 如果数组中的某个元素等于
subSum
,直接将其作为一个子集,并减少子集数量m
。 - 初始化
m
个桶,调用partition
函数进行递归划分。
4. 递归划分:partition
函数
- 如果所有元素都已处理,返回
true
。 - 尝试将当前元素放入每个桶中:
- 如果当前桶和前一个桶的和相同,跳过(避免重复计算)。
- 如果当前元素可以放入当前桶,递归处理下一个元素。
- 如果无法放入任何桶,返回
false
。
示例解析
输入
3
4 3 2 3 5 2 1
运行结果
5
- 解析:
- 数组
[4, 3, 2, 3, 5, 2, 1]
的总和为20
。 - 尝试划分为 3 个子集,目标和为
20 / 3 ≈ 6.67
,无法整除。 - 尝试划分为 2 个子集,目标和为
10
,可以划分为[5, 4, 1]
和[3, 3, 2, 2]
。 - 返回最大子集和
5
。
- 数组
总结
- 该代码通过递归和回溯的方式,尝试将数组划分为
m
个子集。 - 使用降序排序和剪枝优化,提高了算法效率。
- 代码逻辑清晰,适用于解决类似划分问题的场景。
如果有其他问题,欢迎随时提问!
三、Java算法源码
以下是对提供的 Java 代码的中文详细注释和逻辑讲解,同时修复了越界异常问题:
Java 代码实现
import java.util.LinkedList;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取子集数量 mint m = sc.nextInt();// 创建链表存储数组元素LinkedList<Integer> link = new LinkedList<>();for (int i = 0; i < m; i++) {link.add(sc.nextInt()); // 读取数组元素并添加到链表中}// 调用 getResult 函数计算结果并输出System.out.println(getResult(link, m));}/*** 计算将数组划分为 m 个子集的最大子集和* @param link - 输入的链表* @param m - 子集的数量* @return - 最大子集和*/public static int getResult(LinkedList<Integer> link, int m) {// 对链表进行降序排序link.sort((a, b) -> b - a);// 计算链表元素的总和int sum = 0;for (Integer ele : link) {sum += ele;}// 从 m 开始递减,尝试将数组划分为 m 个子集while (m > 0) {// 创建链表的副本,避免修改原链表LinkedList<Integer> link_cp = new LinkedList<>(link);// 如果可以将数组划分为 m 个子集,返回子集和if (canPartitionMSubsets(link_cp, sum, m)) return sum / m;m--;}// 如果无法划分,返回数组总和return sum;}/*** 判断是否可以将数组划分为 m 个子集,每个子集的和为 subSum* @param link - 输入的链表* @param sum - 数组的总和* @param m - 子集的数量* @return - 是否可以划分*/public static boolean canPartitionMSubsets(LinkedList<Integer> link, int sum, int m) {// 如果总和不能被 m 整除,无法划分if (sum % m != 0) return false;// 计算每个子集的目标和int subSum = sum / m;// 如果数组中的最大值大于目标和,无法划分if (subSum < link.get(0)) return false;// 如果数组中的某个元素等于目标和,直接将其作为一个子集// 修复越界异常:增加链表非空检查while (link.size() > 0 && link.get(0) == subSum) {link.removeFirst(); // 移除该元素m--; // 减少子集数量}// 初始化 m 个桶,用于存储每个子集的当前和int[] buckets = new int[m];// 调用 partition 函数进行递归划分return partition(link, 0, buckets, subSum);}/*** 递归尝试将数组划分为 m 个子集* @param link - 输入的链表* @param index - 当前处理的链表索引* @param buckets - 存储每个子集当前和的数组* @param subSum - 每个子集的目标和* @return - 是否可以划分*/public static boolean partition(LinkedList<Integer> link, int index, int[] buckets, int subSum) {// 如果所有元素都已处理,返回 trueif (index == link.size()) return true;// 获取当前处理的元素int select = link.get(index);// 尝试将当前元素放入每个桶中for (int i = 0; i < buckets.length; i++) {// 如果当前桶和前一个桶的和相同,跳过(避免重复计算)if (i > 0 && buckets[i] == buckets[i - 1]) continue;// 如果当前元素可以放入当前桶if (select + buckets[i] <= subSum) {buckets[i] += select; // 将当前元素放入桶中// 递归处理下一个元素if (partition(link, index + 1, buckets, subSum)) return true;buckets[i] -= select; // 回溯:将当前元素从桶中移除}}// 如果无法放入任何桶,返回 falsereturn false;}
}
代码讲解
1. 输入处理
- 使用
Scanner
从控制台读取输入。 - 读取子集数量
m
和数组元素,并存储在LinkedList
中。
2. 主逻辑:getResult
函数
- 对链表进行降序排序,并计算链表元素的总和
sum
。 - 从
m
开始递减,尝试将数组划分为m
个子集。 - 如果成功划分,返回子集和
sum / m
;否则返回数组总和sum
。
3. 判断是否可以划分:canPartitionMSubsets
函数
- 检查总和
sum
是否能被m
整除,如果不能,直接返回false
。 - 计算每个子集的目标和
subSum
。 - 如果数组中的最大值大于
subSum
,无法划分,返回false
。 - 如果数组中的某个元素等于
subSum
,直接将其作为一个子集,并减少子集数量m
。 - 初始化
m
个桶,调用partition
函数进行递归划分。
4. 递归划分:partition
函数
- 如果所有元素都已处理,返回
true
。 - 尝试将当前元素放入每个桶中:
- 如果当前桶和前一个桶的和相同,跳过(避免重复计算)。
- 如果当前元素可以放入当前桶,递归处理下一个元素。
- 如果无法放入任何桶,返回
false
。
修复越界异常
在 canPartitionMSubsets
函数中,修复了以下代码的越界异常:
while (link.get(0) == subSum) { // 原代码可能越界
修改为:
while (link.size() > 0 && link.get(0) == subSum) { // 增加链表非空检查
示例解析
输入
5
5 5 5 5 5
运行结果
5
- 解析:
- 数组
[5, 5, 5, 5, 5]
的总和为25
。 - 尝试划分为 5 个子集,目标和为
5
,可以划分为[5]
,[5]
,[5]
,[5]
,[5]
。 - 返回最大子集和
5
。
- 数组
总结
- 该代码通过递归和回溯的方式,尝试将数组划分为
m
个子集。 - 修复了越界异常问题,确保代码的健壮性。
- 代码逻辑清晰,适用于解决类似划分问题的场景。
如果有其他问题,欢迎随时提问!
四、Python算法源码
以下是对提供的 Python 代码的中文详细注释和逻辑讲解:
Python 代码实现
# 输入获取
m = int(input()) # 读取子集数量 m
link = list(map(int, input().split())) # 读取数组元素并存储在列表中# 算法入口
def getResult(link, m):# 对数组进行降序排序link.sort(reverse=True)# 计算数组元素的总和sumV = 0for ele in link:sumV += ele# 从 m 开始递减,尝试将数组划分为 m 个子集while m > 0:# 创建数组的副本,避免修改原数组if canPartitionMSubsets(link[:], sumV, m):return int(sumV / m) # 如果成功划分,返回子集和m -= 1# 如果无法划分,返回数组总和return sumVdef canPartitionMSubsets(link, sumV, m):# 如果总和不能被 m 整除,无法划分if sumV % m != 0:return False# 计算每个子集的目标和subSum = sumV / m# 如果数组中的最大值大于目标和,无法划分if subSum < link[0]:return False# 如果数组中的某个元素等于目标和,直接将其作为一个子集while len(link) > 0 and link[0] == subSum:link.pop(0) # 移除该元素m -= 1 # 减少子集数量# 初始化 m 个桶,用于存储每个子集的当前和buckets = [0] * m# 调用 partition 函数进行递归划分return partition(link, 0, buckets, subSum)def partition(link, index, buckets, subSum):# 如果所有元素都已处理,返回 Trueif index == len(link):return True# 获取当前处理的元素select = link[index]# 尝试将当前元素放入每个桶中for i in range(len(buckets)):# 如果当前桶和前一个桶的和相同,跳过(避免重复计算)if i > 0 and buckets[i] == buckets[i - 1]:continue# 如果当前元素可以放入当前桶if select + buckets[i] <= subSum:buckets[i] += select # 将当前元素放入桶中# 递归处理下一个元素if partition(link, index + 1, buckets, subSum):return Truebuckets[i] -= select # 回溯:将当前元素从桶中移除# 如果无法放入任何桶,返回 Falsereturn False# 算法调用
print(getResult(link, m))
代码讲解
1. 输入处理
- 使用
input()
函数从控制台读取输入。 - 读取子集数量
m
和数组元素,并存储在列表link
中。
2. 主逻辑:getResult
函数
- 对数组进行降序排序,并计算数组元素的总和
sumV
。 - 从
m
开始递减,尝试将数组划分为m
个子集。 - 如果成功划分,返回子集和
sumV / m
;否则返回数组总和sumV
。
3. 判断是否可以划分:canPartitionMSubsets
函数
- 检查总和
sumV
是否能被m
整除,如果不能,直接返回False
。 - 计算每个子集的目标和
subSum
。 - 如果数组中的最大值大于
subSum
,无法划分,返回False
。 - 如果数组中的某个元素等于
subSum
,直接将其作为一个子集,并减少子集数量m
。 - 初始化
m
个桶,调用partition
函数进行递归划分。
4. 递归划分:partition
函数
- 如果所有元素都已处理,返回
True
。 - 尝试将当前元素放入每个桶中:
- 如果当前桶和前一个桶的和相同,跳过(避免重复计算)。
- 如果当前元素可以放入当前桶,递归处理下一个元素。
- 如果无法放入任何桶,返回
False
。
示例解析
输入
5
5 5 5 5 5
运行结果
5
- 解析:
- 数组
[5, 5, 5, 5, 5]
的总和为25
。 - 尝试划分为 5 个子集,目标和为
5
,可以划分为[5]
,[5]
,[5]
,[5]
,[5]
。 - 返回最大子集和
5
。
- 数组
总结
- 该代码通过递归和回溯的方式,尝试将数组划分为
m
个子集。 - 使用降序排序和剪枝优化,提高了算法效率。
- 代码逻辑清晰,适用于解决类似划分问题的场景。
如果有其他问题,欢迎随时提问!
五、C/C++算法源码:
以下是为 C++ 代码的实现,并附上详细的中文注释和逻辑讲解:
C++ 代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 判断是否可以将数组划分为 m 个子集
bool partition(vector<int>& link, int index, vector<int>& buckets, int subSum);// 判断是否可以将数组划分为 m 个子集,每个子集的和为 subSum
bool canPartitionMSubsets(vector<int> link, int sumV, int m) {// 如果总和不能被 m 整除,无法划分if (sumV % m != 0) return false;// 计算每个子集的目标和int subSum = sumV / m;// 如果数组中的最大值大于目标和,无法划分if (subSum < link[0]) return false;// 如果数组中的某个元素等于目标和,直接将其作为一个子集while (!link.empty() && link[0] == subSum) {link.erase(link.begin()); // 移除该元素m--; // 减少子集数量}// 初始化 m 个桶,用于存储每个子集的当前和vector<int> buckets(m, 0);// 调用 partition 函数进行递归划分return partition(link, 0, buckets, subSum);
}// 递归尝试将数组划分为 m 个子集
bool partition(vector<int>& link, int index, vector<int>& buckets, int subSum) {// 如果所有元素都已处理,返回 trueif (index == link.size()) return true;// 获取当前处理的元素int select = link[index];// 尝试将当前元素放入每个桶中for (int i = 0; i < buckets.size(); i++) {// 如果当前桶和前一个桶的和相同,跳过(避免重复计算)if (i > 0 && buckets[i] == buckets[i - 1]) continue;// 如果当前元素可以放入当前桶if (select + buckets[i] <= subSum) {buckets[i] += select; // 将当前元素放入桶中// 递归处理下一个元素if (partition(link, index + 1, buckets, subSum)) return true;buckets[i] -= select; // 回溯:将当前元素从桶中移除}}// 如果无法放入任何桶,返回 falsereturn false;
}// 算法入口
int getResult(vector<int>& link, int m) {// 对数组进行降序排序sort(link.begin(), link.end(), greater<int>());// 计算数组元素的总和int sumV = 0;for (int ele : link) {sumV += ele;}// 从 m 开始递减,尝试将数组划分为 m 个子集while (m > 0) {// 创建数组的副本,避免修改原数组if (canPartitionMSubsets(link, sumV, m)) {return sumV / m; // 如果成功划分,返回子集和}m--;}// 如果无法划分,返回数组总和return sumV;
}int main() {// 输入获取int m;cin >> m; // 读取子集数量 mvector<int> link;int num;while (cin >> num) {link.push_back(num); // 读取数组元素并存储在 vector 中if (cin.get() == '\n') break; // 如果遇到换行符,结束输入}// 算法调用cout << getResult(link, m) << endl;return 0;
}
代码讲解
1. 输入处理
- 使用
cin
从控制台读取输入。 - 读取子集数量
m
和数组元素,并存储在vector<int> link
中。
2. 主逻辑:getResult
函数
- 对数组进行降序排序,并计算数组元素的总和
sumV
。 - 从
m
开始递减,尝试将数组划分为m
个子集。 - 如果成功划分,返回子集和
sumV / m
;否则返回数组总和sumV
。
3. 判断是否可以划分:canPartitionMSubsets
函数
- 检查总和
sumV
是否能被m
整除,如果不能,直接返回false
。 - 计算每个子集的目标和
subSum
。 - 如果数组中的最大值大于
subSum
,无法划分,返回false
。 - 如果数组中的某个元素等于
subSum
,直接将其作为一个子集,并减少子集数量m
。 - 初始化
m
个桶,调用partition
函数进行递归划分。
4. 递归划分:partition
函数
- 如果所有元素都已处理,返回
true
。 - 尝试将当前元素放入每个桶中:
- 如果当前桶和前一个桶的和相同,跳过(避免重复计算)。
- 如果当前元素可以放入当前桶,递归处理下一个元素。
- 如果无法放入任何桶,返回
false
。
示例解析
输入
5
5 5 5 5 5
运行结果
5
- 解析:
- 数组
[5, 5, 5, 5, 5]
的总和为25
。 - 尝试划分为 5 个子集,目标和为
5
,可以划分为[5]
,[5]
,[5]
,[5]
,[5]
。 - 返回最大子集和
5
。
- 数组
总结
- 该代码通过递归和回溯的方式,尝试将数组划分为
m
个子集。 - 使用降序排序和剪枝优化,提高了算法效率。
- 代码逻辑清晰,适用于解决类似划分问题的场景。
如果有其他问题,欢迎随时提问!
相关文章:
![](https://i-blog.csdnimg.cn/direct/918242775f684d628b7dcf2ee74eb48c.png)
【2024年华为OD机试】(A卷,100分)- 等和子数组最小和(Java JS PythonC/C++)
一、问题描述 题目描述 给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。 输入描述 第一行输入 m 接着输入m个数,表示此数组nums 数据范围:1<m&…...
![](https://www.ngui.cc/images/no-images.jpg)
NFS服务
nfs文件系统 NFS:NetworkFileSystem网络文件系统,基于内核的文件系统。 服务安装 不固定端口启动,会注册到rpcbind(固定端口)服务上, 局域网适用[rootvm ~]# yum -y install nfs-utils # 依赖安装rpcbind [ro…...
![](https://www.ngui.cc/images/no-images.jpg)
RabbitMQ 交换机、队列和路由键的命名规范
在 RabbitMQ 中,使用 Topic Exchange 模式时,交换机、队列和路由键的命名规范是非常重要的,尤其是在多环境和多微服务的场景中。合理的命名规范可以提高消息系统的可维护性、可扩展性以及可读性。以下是一些关于 Topic Exchange 模式中交换机…...
![](https://i-blog.csdnimg.cn/direct/7f40aceb037e459ea675bc2c9442028d.png)
腾讯云AI代码助手编程挑战赛-刑说
作品简介 鉴于当代普法力度不够大,这个刑说可以帮助大家更好的普及法律知识 技术架构 采用了全后端分离的架构,前端使用Vue.js,腾讯云的AI服务处理自然语言理解与生成。 实现过程 开发环境、开发流程 系统:win11 开发工具&…...
![](https://i-blog.csdnimg.cn/direct/1e7f6b44fea84545be6a7781d8c31198.png)
【测试】持续集成CI/CD
近期更新完毕,建议关注收藏点赞~ 目录 概括gitJenkinspostman集成jenkins代码集成jenkins 概括 CI/CD stands for Continuous Integration and Continuous Deployment 定义 团队成果持续集成到公共平台。一天可以集成1次or多次 本地代码管理 git 远程代…...
![](https://www.ngui.cc/images/no-images.jpg)
阿里云直播Web
官方文档:Web播放器SDK常见问题_视频点播(VOD)-阿里云帮助中心 bug:播流的不稳定,直播总会进入 onM3u8Retry 监听,用户端就会黑屏,(但其实并没有关播,正常关播进入的是pause这个监听࿰…...
![](https://i-blog.csdnimg.cn/direct/3075d18912734ceab81c6382a6fb0e95.png)
DuckDB:PRAGMA语句动态配置数据库行为
PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态,并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中,PRAGMA 是一种编译指示(compiler directi…...
![](https://www.ngui.cc/images/no-images.jpg)
GO通过SMTP协议发送邮件
什么是SMTP协议 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于发送邮件的协议。当一个邮件服务器需要发送邮件给另一个邮件服务器时,它会使用SMTP协议与目标服务器建立连接,并传输邮件内容。SMTP协议的…...
![](https://www.ngui.cc/images/no-images.jpg)
轻量自高斯注意力机制LSGAttention模型详解及代码复现
模型背景 近年来,卷积神经网络(CNN)在高光谱图像分类领域取得了显著进展。然而,CNN面临 长距离关系建模 和 计算成本 增加的挑战。为解决这些问题,研究人员提出了基于 轻量自高斯注意(Light Self-Gaussian-Attention, LSGA) 机制的视觉转换器(Vision Transformer, VIT),旨…...
![](https://www.ngui.cc/images/no-images.jpg)
解读若依框架中的`@Excel` 和 `@Excels` 注解
文章目录 一、Excels 注解详解1.1 适用场景1.2 作用与好处 二、Excel 注解详解2.1 核心属性解析2.2 高级用法2.3 综合应用案例 三、总结 解读若依框架中的 Xss 注解博客:解读若依框架中的 Xss 注解 接下来我们将对若依框架中的 Excel 和 Excels 注解进行更加详细的…...
![](https://i-blog.csdnimg.cn/direct/53782d26dc784eb3836266c89b9cc455.png#pic_center)
云商城--基础数据处理和分布式文件存储
第2章 基础数据处理和分布式文件存储 1.分布式文件存储系统Ceph学习 1).掌握Ceph架构 2).掌握Ceph组件 3).搭建Ceph集群(了解) 2.Ceph使用 1).基于Ceph实现文件上传 2).基于Ceph实现文件下载 3.SKU、SPU管理 1).掌握SKU和SPU关系 2).理解商品发…...
![](https://www.ngui.cc/images/no-images.jpg)
六十九:基于openssl实战验证RSA
RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名领域。在实际开发和学习过程中,理解 RSA 的工作原理和使用场景非常重要。本文将以 OpenSSL 工具为基础,通过实例操作来验证和理解 RSA 的…...
![](https://www.ngui.cc/images/no-images.jpg)
Three.js 用户交互:构建沉浸式3D体验的关键
文章目录 前言一、基本交互:鼠标与触摸事件二、高级交互:键盘控制与游戏手柄支持三、物理模拟与碰撞检测四、手势识别与多点触控五、增强现实(AR)与虚拟现实(VR)六、触觉反馈与震动效果七、语音控制八、眼球…...
![](https://www.ngui.cc/images/no-images.jpg)
Android车机DIY开发之学习篇(五)默认应用修改
Android车机DIY开发之学习篇(五)默认应用修改 android默认应用位置 sdk/packages/apps InitRC配置 应用安装的目录 /system/priv-app 该路径存放一些系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使…...
![](https://www.ngui.cc/images/no-images.jpg)
linux 设置mysql 外网访问
1、修改 MySQL 配置文件 找到并编辑配置文件:在Linux系统中,MySQL的配置文件通常是/etc/mysql/my.cnf,使用命令sudo vim /etc/mysql/my.cnf打开文件。 注释或修改 bindaddress:找到bindaddress 127.0.0.1,将其注释掉…...
![](https://www.ngui.cc/images/no-images.jpg)
SQL UNION 操作符
SQL UNION 操作符 SQL UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它将多个结果集组合成一个单独的结果集,并去除重复的行。为了使用 UNION,每个 SELECT 语句必须具有相同的列数,并且对应列的数据类型必须兼容。 语法 SELECT c…...
![](https://www.ngui.cc/images/no-images.jpg)
c++ 17 constexpr
未来已来:从SFINAE到concepts #include <type_traits> #include <vector> #include <list> #include <iostream> // 一个通用的容器打印函数,支持任何带 begin()/end() 的容器 template<typename Container> …...
![](https://www.ngui.cc/images/no-images.jpg)
Java QueryWrapper groupBy自定义字段,以及List<Map>转List<Entity>
Java queryWrapper groupby自定义字段 String sql "data_id,(select value from lz_html a where a.data_id lz_html.data_id and class_nametest-item-status) status," "(select value from lz_html a where a.data_id lz_html.data_id and class_nametes…...
![](https://i-blog.csdnimg.cn/direct/c3b136c8cc67455eb1ec02b4d8fb2b0e.png)
【Rust自学】11.7. 按测试的名称运行测试
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试,就将测试的名称(一个或多个)作为cargo test的…...
![](https://i-blog.csdnimg.cn/direct/8cd19cd732a84741abb6ab054adf5dc0.png)
Git:Cherry-Pick 的使用场景及使用流程
前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能,Cherry-Pick不是merge,只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介: git cherry-pick 是用来从一个分…...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu 24.04 LTS系统安装Docker踩的坑
一开始我跟着Docker给出的官网文档 Ubuntu | Docker Docs 流程走,倒腾了两个多小时,遇到了各种坑,最后放弃了。在我们使用脚本安装Docker命令前,我们先把已经安装的Docker全部卸载掉。 卸载Docker 1.删除docker及安装时自动安装…...
![](https://www.ngui.cc/images/no-images.jpg)
工作生活的感悟
前言 这篇博客基本每年都更新,每年都有新的感悟,作为一个记录吧!以后按照年来记录 2022年 不经意间,已在职场耕耘数载,特此记录以作回顾。 无用之用,方为大用: 年岁渐长,愈发体会…...
![](https://i-blog.csdnimg.cn/direct/767beed36da949e0be7b5106c38f1268.png)
NCCL学习笔记-函数解析
前言 1.NCCL 是一个专注于 GPU 间高性能通信的库,不提供进程管理或安全通信功能。 2.用户需要依赖应用程序的进程管理系统(如 MPI)来管理进程,并确保 NCCL 在安全的网络环境中运行。 3.通过正确配置环境变量(如 NCCL_…...
![](https://i-blog.csdnimg.cn/direct/2b91c70a34b8473c8a26f4787ac7345f.png)
windows系统如何将基座大模型私有化部署
1.windows10系统 安装npm、node、 git 最新版本 安装vmware虚拟机 内存8GB以上 双核4线程 2.vmware虚拟机 安装ubuntu系统 22.04版本 3.进入ubuntu系统 3.1 安装Ollama 基座大模型工具 在命令行中执行 curl -fsSL https://ollama.com/install.sh | sh 浏览器打开 …...
![](https://i-blog.csdnimg.cn/direct/f21c1283977a4f16b2ea0d19c91f5905.png)
牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定
1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。 示例 输入: 3 1 2 3 0 4 5 0 0…...
![](https://i-blog.csdnimg.cn/direct/217cd5f1b6f54031b383139259c5fba6.png)
CentOS 7 下 MySQL 5.7 的详细安装与配置
1、安装准备 下载mysql5.7的安装包 https://dev.mysql.com/get/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 下载后上传至/home目录下 2、mysql5.7安装 2.1、更新yum并安装依赖 yum update -y sudo yum install -y wget sudo yum install libaio sudo yum install perl su…...
![](https://i-blog.csdnimg.cn/direct/b4e2a0c0a2be4c59a3059e718a59788e.png)
【深度学习】数据预处理
为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始, 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中,我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样,pan…...
![](https://i-blog.csdnimg.cn/blog_migrate/f5e62f99d78efcc273a160465d5b327a.png)
day01-HTML-CSS——基础标签样式表格标签表单标签
目录 此篇为简写笔记下端1-3为之前笔记(强迫症、保证文章连续性)完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...
![](https://www.ngui.cc/images/no-images.jpg)
无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型
无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型 随着人工智能技术的快速发展,越来越多的AI模型被广泛应用于各个领域。然而,运行这些模型通常需要高性能的硬件支持,特别是GPU(图形处理器)…...
![](https://i-blog.csdnimg.cn/direct/8109ad707f7c48488710874a9bedcb5a.png)
搭建prometheus+grafana监控系统抓取Linux主机系统资源数据
Prometheus 和 Grafana 是两个非常流行的开源工具,通常结合使用来实现监控、可视化和告警功能。它们在现代 DevOps 和云原生环境中被广泛使用。 1. Prometheus 定义:Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发&am…...
![](/images/no-images.jpg)
政府工程招标网站/天津seo网站管理
我们经常用一些正则来验证url,但是php自带了一个类似的函数filter_var。函数用法:参数标志:FILTER_FLAG_SCHEME_REQUIRED – 要求 URL 是 RFC 兼容 URL。(比如:http://example)FILTER_FLAG_HOST_REQUIRED – 要求 URL 包含主机名(…...
![](/images/no-images.jpg)
兰溪高端网站建设公司/百度官方电话号码
本实用新型为一种双快锁体,具体涉及锁具领域。背景技术:门锁广泛地被应用于生活中,尤其是随着人们安全意识的提高,对门锁的安全性和使用的便捷性的要求也越来越高。现在的锁体类型多样,但是材质上会选用便宜的材料&…...
![](/images/no-images.jpg)
cm域名网站/成人馆店精准引流怎么推广
某培训机构的课程表,不想去培训的,可以按照这个自学。 1 第一阶段JAVASCRIPT高级 1 1 JavaScript高级 1 1 1 call、apply、bind、new等原理解析1 1 2 原型链深入1 1 3 闭包深入1 1 4 执行上下文和作用域链1 1 5 作用域链1 2 ES6深入学习 1 2 1 常量1 2 2…...
![](/images/no-images.jpg)
县区级政府网站建设现状/广州网站设计
1、windows聚焦图片目录路径: C:\Users\Er\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets 2、建立bat 文件 内容: ren *.* *.jpg 转载于:https://www.cnblogs.com/BlogOfEr/p/10048193.html...
![](/images/no-images.jpg)
北京建设工程交易信息网站/百度自动点击器怎么用
投屏技术已经被大量用在身边的产品, 比如电视投屏, 投影仪, 视频会议产品中. 在iOS平台外的其他平台中都已经有非常成熟的标准和实现. 但在封闭的苹果iOS和Mac系统中, 苹果使用私有的Airplay协议进行多屏互动, 只开放给自己生态中的产品. 对此相关技术限制比较严格,…...
![](/images/no-images.jpg)
dw怎么做网站首页/百度网址提交入口
个人认为在自己写接口时,需要返回集合时返回一个空集合,比如mybatis查询如果返回一个集合,结果为空时也会返回一个空集合而不是null。那么这样有什么好处呢?最大的好处就是调用方不用在判断是否为null,可以直接用&…...