力扣第446场周赛

news2025/4/23 11:07:50

 有事没赶上, 赛后模拟了一下, 分享一下我的解题思路和做题感受  

1.执行指令后的得分

题目链接如下:力扣

给你两个数组:instructions 和 values,数组的长度均为 n

你需要根据以下规则模拟一个过程:

  • 从下标 i = 0 的第一个指令开始,初始得分为 0。
  • 如果 instructions[i] 是 "add"
    • 将 values[i] 加到你的得分中。
    • 移动到下一个指令 (i + 1)
  • 如果 instructions[i] 是 "jump"
    • 移动到下标为 (i + values[i]) 的指令,但不修改你的得分。

当以下任一情况发生时,过程会终止:

  • 越界(即 i < 0 或 i >= n),或
  • 尝试再次执行已经执行过的指令。被重复访问的指令不会再次执行。

返回过程结束时的得分。

示例 1:

输入: instructions = ["jump","add","add","jump","add","jump"], values = [2,1,3,1,-2,-3]

输出: 1

解释:

从下标 0 开始模拟过程:

  • 下标 0:指令是 "jump",移动到下标 0 + 2 = 2
  • 下标 2:指令是 "add",将 values[2] = 3 加到得分中,移动到下标 3。得分变为 3。
  • 下标 3:指令是 "jump",移动到下标 3 + 1 = 4
  • 下标 4:指令是 "add",将 values[4] = -2 加到得分中,移动到下标 5。得分变为 1。
  • 下标 5:指令是 "jump",移动到下标 5 + (-3) = 2
  • 下标 2:已经访问过。过程结束。

示例 2:

输入: instructions = ["jump","add","add"], values = [3,1,1]

输出: 0

解释:

从下标 0 开始模拟过程:

  • 下标 0:指令是 "jump",移动到下标 0 + 3 = 3
  • 下标 3:越界。过程结束。

示例 3:

输入: instructions = ["jump"], values = [0]

输出: 0

解释:

从下标 0 开始模拟过程:

  • 下标 0:指令是 "jump",移动到下标 0 + 0 = 0
  • 下标 0:已经访问过。过程结束。

提示:

  • n == instructions.length == values.length
  • 1 <= n <= 10^5
  • instructions[i] 只能是 "add" 或 "jump"
  • -105 <= values[i] <= 10^5

解题思路:模拟的时候wa了好几次,注意不要越界

class Solution {
public:
    long long calculateScore(vector<string>& a, vector<int>& b) {
        unordered_map<int,int> mp;
        int i=0; long long score=0;
        while(i<a.size()){
            if(a[i]=="jump"){
                if(mp[i]) break;
                mp[i]=1;
                i=i+b[i];
                if (i >= a.size() || i < 0) { 
                    break;
                }
            }
            if(a[i]=="add"){
                if(mp[i]) break;
                mp[i]=1;
                score+=b[i];
                // cout<<score<<endl;
                i++;
            }
        }
        return score;
    }
};
2.非递减数组的最大长度 

题目链接如下:力扣

给你一个整数数组 nums。在一次操作中,你可以选择一个子数组,并将其替换为一个等于该子数组 最大值 的单个元素。

返回经过零次或多次操作后,数组仍为 非递减 的情况下,数组 可能的最大长度。

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

示例 1:

输入: nums = [4,2,5,3,5]

输出: 3

解释:

实现最大长度的一种方法是:

将子数组 nums[1..2] = [2, 5] 替换为 5 → [4, 5, 3, 5]。
将子数组 nums[2..3] = [3, 5] 替换为 5 → [4, 5, 5]。
最终数组 [4, 5, 5] 是非递减的,长度为 3。

示例 2:

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

输出: 3

解释:

无需任何操作,因为数组 [1,2,3] 已经是非递减的。

提示:

1 <= nums.length <= 2 * 10^5
1 <= nums[i] <= 2 * 10^5

解题思路: 题意是, 找到递减的子数组, 然后将该子数组用子数组中的最大值进行替换,保证剩余数组的长度尽可能长

class Solution {
public:
    int maximumPossibleSize(vector<int>& nums) {
        int n = nums.size();
        int count = 0;
        int preMax = 0;
        int i = 0;
        while (i < n) {
            if (nums[i] >= preMax) {
                preMax = nums[i];
                count++;
                i++;
            }
            else {
                int curNum = nums[i];
                int j = i + 1;
                while (j < n && curNum < preMax) {
                    curNum = max(curNum, nums[j]);
                    j++;
                }
                if (curNum < preMax) {
                    break;
                }
                preMax = curNum;
                count++;
                i = j;
            }
        }
        return count;
    }
};
 3. 求出数组的 X 值 I

题目链接如下:力扣

给你一个由 正 整数组成的数组 nums,以及一个 正 整数 k

你可以对 nums 执行 一次 操作,该操作中可以移除任意 不重叠 的前缀和后缀,使得 nums 仍然 非空 

你需要找出 nums 的 x 值,即在执行操作后,剩余元素的 乘积 除以 k 后的 余数 为 x 的操作数量。

返回一个大小为 k 的数组 result,其中 result[x] 表示对于 0 <= x <= k - 1nums 的 x 值

数组的 前缀 指从数组起始位置开始到数组中任意位置的一段连续子数组。

数组的 后缀 是指从数组中任意位置开始到数组末尾的一段连续子数组。

子数组 是数组中一段连续的元素序列。

注意,在操作中选择的前缀和后缀可以是 空的 

示例 1:

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

输出: [9,2,4]

解释:

  • 对于 x = 0,可行的操作包括所有不会移除 nums[2] == 3 的前后缀移除方式。
  • 对于 x = 1,可行操作包括:
    • 移除空前缀和后缀 [2, 3, 4, 5]nums 变为 [1]
    • 移除前缀 [1, 2, 3] 和后缀 [5]nums 变为 [4]
  • 对于 x = 2,可行操作包括:
    • 移除空前缀和后缀 [3, 4, 5]nums 变为 [1, 2]
    • 移除前缀 [1] 和后缀 [3, 4, 5]nums 变为 [2]
    • 移除前缀 [1, 2, 3] 和空后缀,nums 变为 [4, 5]
    • 移除前缀 [1, 2, 3, 4] 和空后缀,nums 变为 [5]

示例 2:

输入: nums = [1,2,4,8,16,32], k = 4

输出: [18,1,2,0]

解释:

  • 对于 x = 0,唯一 不 得到 x = 0 的操作有:
    • 移除空前缀和后缀 [4, 8, 16, 32]nums 变为 [1, 2]
    • 移除空前缀和后缀 [2, 4, 8, 16, 32]nums 变为 [1]
    • 移除前缀 [1] 和后缀 [4, 8, 16, 32]nums 变为 [2]
  • 对于 x = 1,唯一的操作是:
    • 移除空前缀和后缀 [2, 4, 8, 16, 32]nums 变为 [1]
  • 对于 x = 2,可行操作包括:
    • 移除空前缀和后缀 [4, 8, 16, 32]nums 变为 [1, 2]
    • 移除前缀 [1] 和后缀 [4, 8, 16, 32]nums 变为 [2]
  • 对于 x = 3,没有可行的操作。

示例 3:

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

输出: [9,6]

提示:

  • 1 <= nums[i] <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= k <= 5 

 解题思路:看不懂题的可以直接看我下面提供的图片

1. 简单来说就是删除一个前缀/后缀后的子数组中元素的乘积除以 k 的余数 x,并返回一个数组 result,其中 result[x] 表示余数为 x 的子数组数量

2. 因为可以删除0个元素, 1个元素, 2个元素, .... , 多个前缀/后缀, 统计删除后的子数组,其实就是在统计所有的子数组。

3. 将数组分两类,一种是不包含nums[i]%k==0, 另一种是包含nums[i]%k==0, 因为是求子数组的乘积%k, 所以只要包含nums[i]%k==0, 它的余数肯定是0, 其他不包含 nums[i]%k==0的子数组的乘积的余数就可能是1,2,3,...,k-1。所以我们就以nums[i]%k==0为分割点分开进行统计(详细在下面代码中), 在每个不包含 nums[i]%k==0的子数组中, 采用动态规划进行统计, 其中pre[x]表示以 nums[i-1] 结尾的子数组,乘积余数为 x 的数量,  cur[x]:表示以 nums[i] 结尾的子数组,乘积余数为x的数量。dp_counts[x]:最终统计所有子数组的乘积余数 x 的总数

4. 补充解释一下, int a=nums[i]%k;  int b=(i*a)%k; 当前元素为nums[i], %k的余数为 a, 其实我们只需要将 a和pre数组中的余数进行想乘即可,也就是 b= (i%a)%k, 看新子数组是否能产生新的余数, eg: 5%3=2, 再加nums[i]=2, 原本需要计算 5*2%3=1, 其实现在只需计算  2*2%3=1即可

5. 数学:计算某一数组中子数组的个数 n*(n+1)/2; 

   eg: nums=[1,2,3] 子数组:[1], [2], [3], [1,2], [1,2,3] ,[2,3], total_sub=3*4/2=6 

 

class Solution {
public:
    vector<long long> resultArray(vector<int>& nums, int k) {
        int n=nums.size(); long long Total_Sub=(long long)n*(n+1)/2;
        //1. 找到以nums[i]%k==0为分界点的子区间
        vector<pair<int,int>> sub_interval;
        int start=0;
        for(int i=0;i<=n;i++){
            if(i==n||nums[i]%k==0){
                if(start<i){
                    sub_interval.emplace_back(start,i-1);
                }
                start=i+1;
            }
        }
        //2. 统计各个子数组中余数的相关信息
        long long total_none_sub=0;
        vector<long long> dp_counts(k,0);
        for(auto& x:sub_interval){
            int l=x.first,r=x.second;
            int len=r-l+1;
            total_none_sub+=(long long)len*(len+1)/2;
            vector<long long> pre(k,0);
            for(int i=l;i<=r;i++){
                int a=nums[i]%k;
                vector<long long> cur(k,0);
                for(int i=0;i<k;i++){
                    if(pre[i]==0) continue;
                    int b=(i*a)%k;
                    cur[b]+=pre[i];
                }
                cur[a]+=1;
                for(int i=0;i<k;i++){
                    dp_counts[i]+=cur[i];
                }
                pre.swap(cur);
            }
        }
        // 3. 至少包含一个nums[i]%k=0 的子数组的数量
        long long zero_sub=Total_Sub-total_none_sub;
        // 4. 统计结果
        vector<long long> result(k,0);
        result[0]=dp_counts[0]+zero_sub;
        for(int i=1;i<k;i++){
            result[i]=dp_counts[i];
        }
        return result;
    }
};
4. 求出数组的 X 值 II 

题目链接如下:3525. 求出数组的 X 值 II - 力扣(LeetCode)

给你一个由 正整数 组成的数组 nums 和一个 正整数 k。同时给你一个二维数组 queries,其中 queries[i] = [indexi, valuei, starti, xi]

你可以对 nums 执行 一次 操作,移除 nums 的任意 后缀 ,使得 nums 仍然非空

给定一个 xnums 的 x值 定义为执行以上操作后剩余元素的 乘积 除以 k 的 余数 为 x 的方案数。

对于 queries 中的每个查询,你需要执行以下操作,然后确定 xi 对应的 nums 的 x值

  • 将 nums[indexi] 更新为 valuei。仅这个更改在接下来的所有查询中保留。
  • 移除 前缀 nums[0..(starti - 1)]nums[0..(-1)] 表示 空前缀 )。

返回一个长度为 queries.length 的数组 result,其中 result[i] 是第 i 个查询的答案。

数组的一个 前缀 是从数组开始位置到任意位置的子数组。

数组的一个 后缀 是从数组中任意位置开始直到结束的子数组。

子数组 是数组中一段连续的元素序列。

注意:操作中所选的前缀或后缀可以是 空的 

注意:x值在本题中与问题 I 有不同的定义。

示例 1:

输入: nums = [1,2,3,4,5], k = 3, queries = [[2,2,0,2],[3,3,3,0],[0,1,0,1]]

输出: [2,2,2]

解释:

  • 对于查询 0,nums 变为 [1, 2, 2, 4, 5] 。移除空前缀后,可选操作包括:
    • 移除后缀 [2, 4, 5] ,nums 变为 [1, 2]
    • 不移除任何后缀。nums 保持为 [1, 2, 2, 4, 5],乘积为 80,对 3 取余为 2。
  • 对于查询 1,nums 变为 [1, 2, 2, 3, 5] 。移除前缀 [1, 2, 2] 后,可选操作包括:
    • 不移除任何后缀,nums 为 [3, 5]
    • 移除后缀 [5] ,nums 为 [3]
  • 对于查询 2,nums 保持为 [1, 2, 2, 3, 5] 。移除空前缀后。可选操作包括:
    • 移除后缀 [2, 2, 3, 5]nums 为 [1]
    • 移除后缀 [3, 5]nums 为 [1, 2, 2]

示例 2:

输入: nums = [1,2,4,8,16,32], k = 4, queries = [[0,2,0,2],[0,2,0,1]]

输出: [1,0]

解释:

  • 对于查询 0,nums 变为 [2, 2, 4, 8, 16, 32]。唯一可行的操作是:
    • 移除后缀 [2, 4, 8, 16, 32]
  • 对于查询 1,nums 仍为 [2, 2, 4, 8, 16, 32]。没有任何操作能使余数为 1。

示例 3:

输入: nums = [1,1,2,1,1], k = 2, queries = [[2,1,0,1]]

输出: [5]

提示:

  • 1 <= nums[i] <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= k <= 5
  • 1 <= queries.length <= 2 * 10^4
  • queries[i] == [indexi, valuei, starti, xi]
  • 0 <= indexi <= nums.length - 1
  • 1 <= valuei <= 10^9
  • 0 <= starti <= nums.length - 1
  • 0 <= xi <= k - 1

解题思路:这道题,群里有人调了一个多小时,才写出来

1. 题意就是, 计算左端点为start, 右端点为start, start+1,....,n-1, 这一共有n-start个子数组, 元素乘积模k为x的子数组的个数

2. 分治计算 [l,r], 也就是左端点为l, 右端点为l, l+1, ... , r 的子数组的个数, 满足元素乘积取模k为x

3. 题目中既有查询, 合并又有修改,类似于前面那道题, M=(l+r)/2, 将右侧的对应的余数的个数合并到左侧

4. 下面代码中的线段树板子是抄的大佬的, 具体修改的部分已经在代码中指出。

class SegmentTree {
    int n; int k; using T = pair<int, array<int, 5>>;
    vector<T> tree;
    //1. 修改
    T merge_val(T a, T b) const {
        auto [x,cnt]=a;
        for(int i=0;i<k;i++){
            cnt[x*i%k]+=b.second[i];
        }
        return {x*b.first%k,cnt};
    }
    //2. 修改
    T new_val(int val) const {
        int x = val % k;
        array<int, 5> cnt{};
        cnt[x]=1;
        return {x, cnt};
    }
    void maintain(int node) {
        tree[node] = merge_val(tree[node * 2], tree[node * 2 + 1]);
    }
    void build(const vector<int>& a, int node, int l, int r) {
        if (l == r) { 
            tree[node] = new_val(a[l]);
            return;
        }
        int m = (l + r) / 2;
        build(a, node * 2, l, m); 
        build(a, node * 2 + 1, m + 1, r); 
        maintain(node);
    }
    void update(int node, int l, int r, int i, int val) {
        if (l == r) { 
            tree[node] = new_val(val);
            return;
        }
        int m = (l + r) / 2;
        if (i <= m) {
            update(node * 2, l, m, i, val);
        } else {  
            update(node * 2 + 1, m + 1, r, i, val);
        }
        maintain(node);
    }

    T query(int node, int l, int r, int ql, int qr) const {
        if (ql <= l && r <= qr) { 
            return tree[node];
        }
        int m = (l + r) / 2;
        if (qr <= m) {  
            return query(node * 2, l, m, ql, qr);
        }
        if (ql > m) {  
            return query(node * 2 + 1, m + 1, r, ql, qr);
        }
        T l_res = query(node * 2, l, m, ql, qr);
        T r_res = query(node * 2 + 1, m + 1, r, ql, qr);
        return merge_val(l_res, r_res);
    }
public:
    // SegmentTree(int n, T init_val) : SegmentTree(vector<T>(n, init_val)) {}
    SegmentTree(const vector<int>& a, int k) : k(k), n(a.size()), tree(2 << bit_width(a.size() - 1)) {
        build(a, 1, 0, n - 1);
    }
    void update(int i, int val) {
        update(1, 0, n - 1, i, val);
    }
    T query(int ql, int qr) const {
        return query(1, 0, n - 1, ql, qr);
    }
    T get(int i) const {
        return query(1, 0, n - 1, i, i);
    }
};
class Solution {
public:
    vector<int> resultArray(vector<int>& nums, int k, vector<vector<int>>& queries) {
        SegmentTree t(nums,k);
        int n=nums.size();
        vector<int> ans;
        for(auto& it:queries){
           //1. 按题意先修改
           t.update(it[0],it[1]);
           //2. 删除前缀和后
           auto [x,cnt]=t.query(it[2],n-1);
           ans.push_back(cnt[it[3]]);
        }
        return ans;
    }
};
// queries[i] = [indexi, valuei, starti, xi]

有不懂的地方可以发布到评论区!

最后,感谢大家的点赞和关注,你们的支持是我创作的动力!

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

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

相关文章

OpenCV中的透视变换方法详解

文章目录 引言1. 什么是透视变换2. 透视变换的数学原理3. OpenCV中的透视变换代码实现3.1 首先定义四个函数 3.1.1 cv_show() 函数 3.1.2 def resize() 函数 3.1.3 order_points() 函数 3.1.4 four_point_transform() 函数 3.2 读取图片并做预处理3.3 轮廓检测3.4 获取最大…

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

如何理解抽象且不易理解的华为云 API?

API的概念在华为云的使用中非常抽象&#xff0c;且不容易理解&#xff0c;用通俗的语言 形象的比喻来讲清楚——什么是华为云 API&#xff0c;怎么用&#xff0c;背后原理&#xff0c;以及主要元素有哪些&#xff0c;尽量让新手也能明白。 &#x1f9e0; 一句话先理解&#xf…

深度学习-全连接神经网络(过拟合,欠拟合。批量标准化)

七、过拟合与欠拟合 在训练深层神经网络时&#xff0c;由于模型参数较多&#xff0c;在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合&#xff0c;提升模型的泛化能力(对新数据表现良好)和鲁棒性&#xff08;对异常数据表现良好&#xff09;。 1. 概念认知 …

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

流水线记忆要点‌ ‌公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt&#xff08;max&#xff09; 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期&#xff1a;最长段Δt 冲突‌&#xff1a; ‌数据冲突&#xff08;RAW&#xff09; → 旁路/…

复刻低成本机械臂 SO-ARM100 3D 打印篇

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机&#xff0c;挤出机也裂了&#xff0c;更换了喷嘴和挤出机夹具&#xff0c;终于恢复了正常工作的状态&#xff0c;接下来还是要用起来&#xff0c;不然吃灰生锈了&#xff0c;于是乎想起…

Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有

错误信息&#xff1a; SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用&#xff1a;所有请求的入口&#xff0c;负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…

使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互

引言 在现代前端开发中&#xff0c;与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端&#xff0c;以其简洁易用、功能强大的特点&#xff0c;成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…

理解字符设备、设备模型与子系统:以 i.MX8MP 平台为例

视频教程请关注 B 站&#xff1a;“嵌入式 Jerry” Linux 内核驱动开发中&#xff0c;很多人在接触字符设备&#xff08;char device&#xff09;、设备模型&#xff08;device model&#xff09;和各种子系统&#xff08;subsystem&#xff09;时&#xff0c;往往会感到概念混…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道&#xff0c;Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了&#xff0c; Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供&#xff0c;最近有小伙伴反馈已经 2 个多月没有停止更新了&#xff0c;不少人以为停…

网络基础概念(下)

网络基础概念&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147261091?sharetypeblogdetail&sharerId147261091&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 网络传输的基本流程 局域网网络传输流…

一个关于相对速度的假想的故事-4

回到公式&#xff0c; 正写速度叠加和倒写速度叠加的倒写相等&#xff0c;这就是这个表达式所要表达的意思。但倒写叠加用的是减法&#xff0c;而正写叠加用的是加法。当然是这样&#xff0c;因为正写叠加要的是单位时间上完成更远的距离&#xff0c;而倒写叠加说的是单位距离需…

Idea创建项目的搭建方式

目录 一、普通Java项目 二、普通JavaWeb项目 三、maven的JavaWeb项目 四、maven的Java项目 一、普通Java项目 1. 点击 Create New Project 2. 选择Java项目&#xff0c;选择JDK&#xff0c;点击Next 3. 输入项目名称&#xff08;驼峰式命名法&#xff09;&#xff0c;可选…

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群&#xff08;包含4个GPU虚拟机&#xff0c;类型为ecs.gn7i-c32g1.32xlarge&#xff09;。每台虚拟机配备4个NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通过PCI-e 4.0连接&#xff09;、128个vCPU、752 GB内…

Kubernetes相关的名词解释kubeadm(19)

kubeadm是什么&#xff1f; kubeadm 是 Kubernetes 官方提供的一个用于快速部署和管理 Kubernetes 集群的命令行工具。它简化了集群的初始化、节点加入和升级过程&#xff0c;特别适合在生产环境或学习环境中快速搭建符合最佳实践的 Kubernetes 集群。 kubeadm 的定位 不是完整…

什么是负载均衡?NGINX是如何实现负载均衡的?

大家好&#xff0c;我是锋哥。今天分享关于【什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…

基于Python(Django)+SQLite实现(Web)校园助手

校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验&#xff1a; 学生界面: 账号1&#xff1a;123 密码1&#xff1a;123 账户2&#xff1a;201805301348 密码2&#xff1a;1 # --------------…

从零开始搭建Django博客②--Django的服务器内容搭建

本文主要在Ubuntu环境上搭建&#xff0c;为便于研究理解&#xff0c;采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建&#xff0c;当涉及一些文件操作部分便于通过桌面化进行理解&#xff0c;通过Nginx代理绑定域名&#xff0c;对外发布。 此为从零开始搭建Django博客…

【读论文】HM-RAG:分层多智能体多模态检索增强生成

如何在多模态信息检索和生成中&#xff0c;通过协作式多智能体系统来处理复杂的多模态查询。传统的单代理RAG系统在处理需要跨异构数据生态系统进行协调推理的复杂查询时存在根本性限制:处理多种查询类型、数据格式异质性和检索任务目标的多样性&#xff1b;在视觉内容和文本内…