蓝桥杯算法实战分享:C/C++ 题型解析与实战技巧

news2025/4/23 6:49:34

        蓝桥杯全国软件和信息技术专业人才大赛,作为国内知名的算法竞赛之一,吸引了众多编程爱好者参与。在蓝桥杯的赛场上,C/C++ 因其高效性和灵活性,成为了众多选手的首选语言。本文将结合蓝桥杯的赛制特点、常见题型以及实战案例,分享一些 C/C++ 解题技巧与策略,帮助大家在比赛中取得更好的成绩。

一、蓝桥杯算法竞赛概述

        蓝桥杯算法竞赛注重考察选手的算法设计能力、编程实现能力以及问题解决能力。比赛题目涵盖了数据结构、算法设计、动态规划、图论、数论等多个领域,要求选手在有限的时间内,快速分析问题、设计算法并编程实现。


二、C/C++ 解题基础

1. 语言特性

  • 高效性:C/C++ 语言执行效率高,适合处理大规模数据和复杂算法。
  • 灵活性:支持指针操作、内存管理,便于实现高级数据结构。
  • 标准库:STL(Standard Template Library)提供了丰富的数据结构(如 vector、map、set)和算法(如 sort、lower_bound),可大大提高编程效率。

2. 编程规范

  • 代码风格:保持代码整洁、易读,使用有意义的变量名和函数名。
  • 注释习惯:在关键算法和复杂逻辑处添加注释,便于自己和他人理解。
  • 错误处理:合理使用异常处理机制,确保程序的健壮性。

三、常见题型与解题技巧

1. 数据结构题

  • 数组与字符串:掌握数组的遍历、排序、查找等基本操作;熟悉字符串的匹配、替换、分割等算法。
  • 链表与树:理解链表和树的基本结构,掌握链表的插入、删除、反转等操作;熟悉二叉树的遍历、搜索、平衡等算法。
  • 图论:掌握图的表示方法(邻接矩阵、邻接表);熟悉图的遍历(DFS、BFS)、最短路径(Dijkstra、Floyd)、最小生成树(Prim、Kruskal)等算法。

示例:Dijkstra 算法

        给定一个有向加权图(以邻接表形式表示),以及一个起点,请计算并输出从起点到其它所有节点的最短距离。如果某个节点不可达,则输出 INF 表示无穷大。

#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

// 定义无穷大的值
const int INF = INT_MAX;

/**
 * 使用 Dijkstra 算法计算单源最短路径。
 * 
 * @param n 节点的数量(从 0 到 n-1 编号)。
 * @param adj 邻接表表示的图,adj[u] 是一个 vector,存储从节点 u 出发的所有边,
 *            每条边用一个 pair 表示,pair 的 first 是目标节点 v,second 是边权重 w。
 * @param start 起始节点编号。
 * @return 一个 vector,存储从起始节点到每个节点的最短距离。如果某个节点不可达,则距离为 INF。
 */
vector<int> dijkstra(int n, vector<vector<pair<int, int>>> &adj, int start) {
    // 初始化距离数组 dist,所有节点的距离设置为 INF,表示尚未访问
    vector<int> dist(n, INF);
    dist[start] = 0; // 起始节点到自身的距离为 0

    // 定义优先队列 pq,使用小顶堆存储 (当前距离, 当前节点),以实现每次取出最小距离的节点
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, start}); // 将起始节点加入优先队列,距离为 0

    // 当优先队列不为空时,继续处理
    while (!pq.empty()) {
        // 取出当前距离最小的节点 u
        int u = pq.top().second;
        pq.pop();

        // 遍历节点 u 的所有邻接边
        for (auto &edge : adj[u]) {
            int v = edge.first;  // 边的目标节点
            int w = edge.second; // 边的权重

            // 如果通过节点 u 到节点 v 的路径更短,则更新 dist[v]
            if (dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w; // 更新最短距离
                pq.push({dist[v], v}); // 将更新后的节点 v 加入优先队列
            }
        }
    }

    return dist;
}

int main() {
    // 示例图结构(邻接表表示)
    // 图中有 5 个节点,编号从 0 到 4
    int n = 5;
    vector<vector<pair<int, int>>> adj(n);

    // 添加边及其权重
    adj[0].push_back({1, 10});
    adj[0].push_back({3, 5});
    adj[1].push_back({2, 1});
    adj[1].push_back({3, 2});
    adj[2].push_back({4, 4});
    adj[3].push_back({1, 3});
    adj[3].push_back({2, 9});
    adj[3].push_back({4, 2});
    adj[4].push_back({0, 7});
    adj[4].push_back({2, 6});

    // 起点
    int start = 0;

    // 计算最短路径
    vector<int> dist = dijkstra(n, adj, start);

    // 输出结果
    cout << "从节点 " << start << " 出发到各个节点的最短距离:" << endl;
    for (int i = 0; i < n; ++i) {
        cout << "到节点 " << i << " 的最短距离是 ";
        if(dist[i] == INF) cout << "INF"; // 如果距离为 INF,表示不可达
        else cout << dist[i];
        cout << endl;
    }

    return 0;
}

示例:反转链表

        给定一个单链表的头节点 head,请将其反转并返回反转后的链表头节点。例如:

  • 输入:1 -> 2 -> 3 -> 4 -> 5
  • 输出:5 -> 4 -> 3 -> 2 -> 1
#include <iostream>

using namespace std;

// 定义链表节点结构
struct ListNode {
    int val;          // 节点值
    ListNode* next;   // 指向下一个节点的指针
    ListNode(int x) : val(x), next(nullptr) {} // 构造函数
};

/**
 * 反转链表的函数。
 * 
 * @param head 单链表的头节点。
 * @return 反转后的链表头节点。
 */
ListNode* reverseList(ListNode* head) {
    // 定义三个指针:prev、curr 和 next
    ListNode* prev = nullptr; // 初始时,前一个节点为空
    ListNode* curr = head;    // 当前节点从头节点开始

    // 遍历链表,直到当前节点为空
    while (curr != nullptr) {
        ListNode* next = curr->next; // 保存当前节点的下一个节点
        curr->next = prev;           // 将当前节点的 next 指向前一个节点,实现反转
        prev = curr;                 // 移动 prev 到当前节点
        curr = next;                 // 移动 curr 到下一个节点
    }

    // 循环结束后,prev 指向新的头节点(原链表的尾节点)
    return prev;
}

// 辅助函数:打印链表
void printList(ListNode* head) {
    ListNode* curr = head;
    while (curr != nullptr) {
        cout << curr->val << " ";
        curr = curr->next;
    }
    cout << endl;
}

int main() {
    // 创建一个示例链表:1 -> 2 -> 3 -> 4 -> 5
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    head->next->next->next->next = new ListNode(5);

    cout << "原链表:" << endl;
    printList(head);

    // 反转链表
    ListNode* reversedHead = reverseList(head);

    cout << "反转后的链表:" << endl;
    printList(reversedHead);

    return 0;
}

示例:Kruskal 算法求最小生成树

        给定一个无向加权图,请使用 Kruskal 算法找到其最小生成树(MST)。如果图不连通,则返回森林的最小生成树。例如:

  • 输入:图的边列表 edges = [[0, 1, 10], [0, 2, 6], [0, 3, 5], [1, 3, 15], [2, 3, 4]],节点数 n = 4
  • 输出:最小生成树的边集合及其总权重。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定义边的结构体
struct Edge {
    int u; // 边的一个端点
    int v; // 边的另一个端点
    int weight; // 边的权重
};

// 并查集(Union-Find)数据结构,用于检测环
class UnionFind {
private:
    vector<int> parent; // 每个节点的父节点
    vector<int> rank;   // 树的高度(秩)

public:
    // 构造函数,初始化并查集
    UnionFind(int n) {
        parent.resize(n);
        rank.resize(n, 0);
        for (int i = 0; i < n; ++i) {
            parent[i] = i; // 初始时每个节点的父节点是自身
        }
    }

    // 查找操作,带路径压缩
    int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]); // 路径压缩
        }
        return parent[x];
    }

    // 合并操作,按秩合并
    void unite(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX != rootY) {
            if (rank[rootX] > rank[rootY]) {
                parent[rootY] = rootX;
            } else if (rank[rootX] < rank[rootY]) {
                parent[rootX] = rootY;
            } else {
                parent[rootY] = rootX;
                rank[rootX]++;
            }
        }
    }
};

/**
 * 使用 Kruskal 算法求最小生成树。
 * 
 * @param n 节点的数量(从 0 到 n-1 编号)。
 * @param edges 图的边列表,每条边表示为 (u, v, weight)。
 * @return 最小生成树的边集合及其总权重。
 */
pair<vector<Edge>, int> kruskal(int n, vector<Edge> &edges) {
    // 将边按权重从小到大排序
    sort(edges.begin(), edges.end(), [](const Edge &a, const Edge &b) {
        return a.weight < b.weight;
    });

    UnionFind uf(n); // 初始化并查集
    vector<Edge> mst; // 存储最小生成树的边
    int totalWeight = 0; // 最小生成树的总权重

    // 遍历所有边
    for (const auto &edge : edges) {
        int u = edge.u;
        int v = edge.v;
        int weight = edge.weight;

        // 如果 u 和 v 不在同一个集合中,则添加这条边到 MST 中
        if (uf.find(u) != uf.find(v)) {
            uf.unite(u, v); // 合并两个集合
            mst.push_back(edge); // 将边加入最小生成树
            totalWeight += weight; // 累加权重
        }
    }

    return {mst, totalWeight};
}

int main() {
    // 图的节点数和边列表
    int n = 4;
    vector<Edge> edges = {
        {0, 1, 10}, {0, 2, 6}, {0, 3, 5},
        {1, 3, 15}, {2, 3, 4}
    };

    // 使用 Kruskal 算法求最小生成树
    pair<vector<Edge>, int> result = kruskal(n, edges);
    vector<Edge> mst = result.first;
    int totalWeight = result.second;

    // 输出结果
    cout << "最小生成树的边:" << endl;
    for (const auto &edge : mst) {
        cout << edge.u << " - " << edge.v << " (权重: " << edge.weight << ")" << endl;
    }
    cout << "最小生成树的总权重: " << totalWeight << endl;

    return 0;
}

2. 算法设计题

  • 动态规划:理解动态规划的基本思想,掌握状态定义、状态转移方程的设计方法。
  • 贪心算法:学会分析问题的贪心性质,设计贪心策略。
  • 回溯与搜索:掌握回溯算法的基本框架,学会剪枝优化。

示例:背包问题

        给定一个容量为 W 的背包和 n 个物品,每个物品有一个重量 w[i] 和一个价值 v[i]。要求从这些物品中选择一些装入背包,在不超过背包容量的前提下,使得背包中的物品总价值最大。

        此外,增加以下限制条件:

  1. 如果可以选择的物品数量超过 k 件,则必须使用回溯算法枚举所有可能的选择。
  2. 如果物品数量较少(小于等于 k),则使用动态规划解决。
  3. 使用贪心算法给出一种近似解,并与动态规划或回溯的结果进行比较。

算法设计:

  • 动态规划(物品数 ≤ k):
    • 状态定义dp[i][j] 表示前 i 个物品在容量为 j 的情况下能获得的最大价值。
    • 状态转移方程
      • 不选第 i 个物品:dp[i][j] = dp[i-1][j]
      • 选第 i 个物品:dp[i][j] = dp[i-1][j-w[i]] + v[i] (前提是 j >= w[i]
      • 最终状态:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
  • 贪心算法:

    • 按照单位价值(v[i]/w[i])对物品排序,优先选择单位价值高的物品,直到背包装满。
  • 回溯与搜索(物品数 > k):

    • 使用回溯算法枚举所有可能的选择。
    • 剪枝优化:如果当前选择的物品总重量已经超过背包容量,则直接返回。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 物品结构体
struct Item {
    int weight; // 物品重量
    int value;  // 物品价值
};

// 动态规划求解
int knapsackDP(int W, const vector<Item> &items) {
    int n = items.size();
    vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));

    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= W; ++j) {
            dp[i][j] = dp[i - 1][j]; // 不选第 i 个物品
            if (j >= items[i - 1].weight) { // 选第 i 个物品
                dp[i][j] = max(dp[i][j], dp[i - 1][j - items[i - 1].weight] + items[i - 1].value);
            }
        }
    }

    return dp[n][W];
}

// 贪心算法求解
int knapsackGreedy(int W, const vector<Item> &items) {
    vector<pair<double, int>> unitValue(items.size()); // 单位价值和索引
    for (int i = 0; i < items.size(); ++i) {
        unitValue[i] = {static_cast<double>(items[i].value) / items[i].weight, i};
    }
    sort(unitValue.rbegin(), unitValue.rend()); // 按单位价值降序排序

    int totalValue = 0;
    int remainingWeight = W;
    for (const auto &[_, idx] : unitValue) {
        if (remainingWeight >= items[idx].weight) {
            totalValue += items[idx].value;
            remainingWeight -= items[idx].weight;
        }
    }

    return totalValue;
}

// 回溯算法求解
void backtrack(int idx, int currentWeight, int currentValue, int W, const vector<Item> &items, int &maxValue) {
    if (currentWeight > W) return; // 剪枝:超出背包容量
    if (idx == items.size()) {
        maxValue = max(maxValue, currentValue); // 更新最大值
        return;
    }

    // 不选当前物品
    backtrack(idx + 1, currentWeight, currentValue, W, items, maxValue);

    // 选当前物品
    if (currentWeight + items[idx].weight <= W) {
        backtrack(idx + 1, currentWeight + items[idx].weight, currentValue + items[idx].value, W, items, maxValue);
    }
}

int knapsackBacktrack(int W, const vector<Item> &items) {
    int maxValue = 0;
    backtrack(0, 0, 0, W, items, maxValue);
    return maxValue;
}

int main() {
    // 输入数据
    int W = 50; // 背包容量
    vector<Item> items = {{10, 60}, {20, 100}, {30, 120}}; // 物品列表
    int k = 2; // 动态规划与回溯的分界点

    // 动态规划求解
    if (items.size() <= k) {
        cout << "动态规划结果: " << knapsackDP(W, items) << endl;
    } else {
        // 回溯算法求解
        cout << "回溯算法结果: " << knapsackBacktrack(W, items) << endl;
    }

    // 贪心算法求解
    cout << "贪心算法结果: " << knapsackGreedy(W, items) << endl;

    return 0;
}

3. 数学题

  • 数论:掌握素数判断、最大公约数、最小公倍数等算法。
  • 组合数学:熟悉排列组合、二项式定理等知识点。
  • 概率统计:理解基本概率模型,掌握期望、方差等统计量的计算。

示例:质因数分解与组合计数

        给定一个正整数 n,请完成以下任务:

  1. 将 n 进行质因数分解,并输出其所有质因数及其对应的指数。
  2. 计算从 1 到 n 中所有数的排列数(即 n!n!)并输出结果。
  3. 如果 n!n! 的值过大,计算 n!mod  109+7n!mod109+7。

        例如:

  • 输入:n = 6
  • 输出:
    • 质因数分解:6 = 2^1 * 3^1
    • 排列数:6! = 720
    • 模运算结果:720 % (10^9+7) = 720
#include <iostream>
#include <vector>
using namespace std;

// 定义模数
const int MOD = 1e9 + 7;

// 质因数分解函数
vector<pair<int, int>> primeFactorization(int n) {
    vector<pair<int, int>> factors; // 存储质因数及其指数
    for (int i = 2; i * i <= n; ++i) {
        if (n % i == 0) { // i 是 n 的因子
            int count = 0;
            while (n % i == 0) {
                n /= i;
                count++;
            }
            factors.emplace_back(i, count); // 添加质因数及其指数
        }
    }
    if (n > 1) { // 剩下的 n 是一个质数
        factors.emplace_back(n, 1);
    }
    return factors;
}

// 阶乘计算函数(带模运算)
long long factorialMod(int n, int mod) {
    long long result = 1;
    for (int i = 1; i <= n; ++i) {
        result = (result * i) % mod; // 每一步取模
    }
    return result;
}

int main() {
    // 输入数据
    int n;
    cout << "请输入一个正整数 n: ";
    cin >> n;

    // 1. 质因数分解
    vector<pair<int, int>> factors = primeFactorization(n);
    cout << "质因数分解结果: " << n << " = ";
    for (size_t i = 0; i < factors.size(); ++i) {
        cout << factors[i].first << "^" << factors[i].second;
        if (i != factors.size() - 1) cout << " * ";
    }
    cout << endl;

    // 2. 计算阶乘 n!
    long long factorial = 1;
    for (int i = 1; i <= n; ++i) {
        factorial *= i;
    }
    cout << "n! 的值: " << factorial << endl;

    // 3. 计算 n! % (10^9+7)
    long long factorialModResult = factorialMod(n, MOD);
    cout << "n! % (10^9+7): " << factorialModResult << endl;

    return 0;
}

四、实战策略与技巧

1. 时间管理
  • 合理安排时间,优先解决易得分的题目。
  • 对于难题,先尝试部分分,再逐步攻克。
2. 代码调试
  • 使用调试工具(如 gdb)进行逐步调试。
  • 编写测试用例,验证代码的正确性。
3. 代码优化
  • 减少不必要的计算,提高算法效率。
  • 使用合适的数据结构,降低时间复杂度。

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

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

相关文章

分布式光纤测温技术让森林火灾预警快人一步

2025年春季&#xff0c;多地接连发生森林火灾&#xff0c;累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期&#xff0c;加之清明节已到来&#xff0c;生产生活用火活跃&#xff0c;民俗祭祀用火集中&#xff0c;森林火灾风险进一步加大。森林防火&#xff0c;人人…

Vue2 el-checkbox 虚拟滚动解决多选框全选卡顿问题 - 高性能处理大数据量选项列表

一、背景 在我们开发项目中&#xff0c;经常会遇到需要展示大量选项的多选框场景&#xff0c;比如权限配置、数据筛选等。当选项数量达到几百甚至上千条时&#xff0c;传统的渲染方式全选时会非常卡顿&#xff0c;导致性能问题。本篇文章&#xff0c;记录我使用通过虚拟滚动实现…

KUKA机器人KR 3 D1200 HM介绍

KUKA KR 3 D1200 HM是一款小型机器人&#xff0c;型号中HM代表“Hygienic Machine&#xff08;卫生机械&#xff09;用于主副食品行业”&#xff0c;也是一款并联机器人。用于执行高速、高精度的抓取任务。这款机器人采用食品级不锈钢设计&#xff0c;额定负载为3公斤&#xff…

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法&#xff08;多输入单输出&#xff09; 引言 本文使用状态空间模型实现失业率递归预测&#xff0c;状态空间模型&#xff08;State Space Model, SSM&#xff09;是一种用于描述动态系统行为的…

【Linux】线程ID、线程管理、与线程互斥

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 上篇文章&#xff1a; 【Linux】线程&#xff1a;从原理到实战&#xff0c;全面掌握多线程编程&#xff01;-CSDN博客 下…

【锂电池SOH估计】RF随机森林锂电池健康状态估计,锂电池SOH估计(Matlab完整源码和数据)

目录 效果一览程序获取程序内容代码分享研究内容基于随机森林(RF)的锂电池健康状态(SOH)估计算法研究摘要1. 引言2. 锂电池SOH评估框架3. 实验与结果分析4. 未来研究方向6. 结论效果一览 程序获取 获取方式一:文章顶部资源处直接下载:【锂电池SOH估计】RF随机森林锂电池…

【Pytorch 中的扩散模型】去噪扩散概率模型(DDPM)的实现

介绍 广义上讲&#xff0c;扩散模型是一种生成式深度学习模型&#xff0c;它通过学习到的去噪过程来创建数据。扩散模型有很多变体&#xff0c;其中最流行的通常是文本条件模型&#xff0c;它可以根据提示生成特定的图像。一些扩散模型&#xff08;例如 Control-Net&#xff0…

121.在 Vue3 中使用 OpenLayers 实现去掉鼠标右键默认菜单并显示 Feature 信息

🎯 实现效果 👇 本文最终实现的效果如下: ✅ 地图初始化时绘制一个多边形; ✅ 鼠标 右键点击地图任意位置; ✅ 若命中 Feature,则弹出该图形的详细信息; ✅ 移除浏览器默认的右键菜单,保留地图交互的完整控制。 💡 整个功能基于 Vue3 + OpenLayers 完成,采用 Com…

进阶篇 第 6 篇:时间序列遇见机器学习与深度学习

进阶篇 第 6 篇&#xff1a;时间序列遇见机器学习与深度学习 (图片来源: Tara Winstead on Pexels) 在上一篇中&#xff0c;我们探讨了如何通过精心的特征工程&#xff0c;将时间序列预测问题转化为机器学习可以处理的监督学习任务。我们学习了如何创建滞后特征、滚动统计特征…

【音视频】音频解码实战

音频解码过程 ⾳频解码过程如下图所示&#xff1a; FFmpeg流程 关键函数 关键函数说明&#xff1a; avcodec_find_decoder&#xff1a;根据指定的AVCodecID查找注册的解码器。av_parser_init&#xff1a;初始化AVCodecParserContext。avcodec_alloc_context3&#xff1a;为…

DOCA介绍

本文分为两个部分&#xff1a; DOCA及BlueField介绍如何运行DOCA应用&#xff0c;这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍&#xff1a; 现代企业数据中心是软件定义的、完全可编程的基础设施&#xff0c;旨在服务于跨云、核心和边缘环境的高度分布式应用工作…

# 利用迁移学习优化食物分类模型:基于ResNet18的实践

利用迁移学习优化食物分类模型&#xff1a;基于ResNet18的实践 在深度学习的众多应用中&#xff0c;图像分类一直是一个热门且具有挑战性的领域。随着研究的深入&#xff0c;我们发现利用预训练模型进行迁移学习是一种非常有效的策略&#xff0c;可以显著提高模型的性能&#…

洗车小程序系统前端uniapp 后台thinkphp

洗车小程序系统 前端uniapp 后台thinkphp 支持多门店 分销 在线预约 套餐卡等

HCIP(综合实验2)

1.实验拓补图 2.实验要求 1.根据提供材料划分VLAN以及IP地址&#xff0c;PC1/PC2属于生产一部员工划分VLAN10,PC3属于生产二部划分VLAN20 2.HJ-1HJ-2交换机需要配置链路聚合以保证业务数据访问的高带宽需求 3.VLAN的放通遵循最小VLAN透传原则 4.配置MSTP生成树解决二层环路问题…

Linux mmp文件映射补充(自用)

addr一般为NULL由OS指明&#xff0c;length所需长度&#xff08;4kb对齐&#xff09;&#xff0c;prot&#xff08;权限&#xff0c;一般O_RDWR以读写&#xff09;&#xff0c; flag&#xff08;MAP_SHARED(不刷新到磁盘上&#xff0c;此进程独有)和MAP_PRIVATE&#xff08;刷新…

单元测试学习笔记(一)

自动化测试 通过测试工具/编程模拟手动测试步骤&#xff0c;全自动半自动执行测试用例&#xff0c;对比预期输出和实际输出&#xff0c;记录并统计测试结果&#xff0c;减少重复的工作量。 单元测试 针对最小的单元测试&#xff0c;Java中就是一个一个的方法就是一个一个的单…

【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)

新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…

OpenHarmony OS 5.0与Android 13显示框架对比

1. 架构概述 1.1 OpenHarmony OS 5.0架构 OpenHarmony OS 5.0采用分层架构设计&#xff0c;图形显示系统从底层到顶层包括&#xff1a; 应用层&#xff1a;ArkUI应用和第三方应用框架层&#xff1a;ArkUI框架、窗口管理API系统服务层&#xff1a;图形合成服务、窗口管理服务…

[Java] 泛型

目录 1、初识泛型 1.1、泛型类的使用 1.2、泛型如何编译的 2、泛型的上界 3、通配符 4、通配符上界 5、通配符下界 1、初识泛型 泛型&#xff1a;就是将类型进行了传递。从代码上讲&#xff0c;就是对类型实现了参数化。 泛型的主要目的&#xff1a;就是指定当前的容器…

Spark–steaming

实验项目: 找出所有有效数据&#xff0c;要求电话号码为11位&#xff0c;但只要列中没有空值就算有效数据。 按地址分类&#xff0c;输出条数最多的前20个地址及其数据。 代码讲解&#xff1a; 导包和声明对象&#xff0c;设置Spark配置对象和SparkContext对象。 使用Spark S…