【秋招突围】2024届秋招笔试-小红书笔试题-第二套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系计划跟新各公司春秋招的笔试题

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📧 清隆这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注CSDN同名公主号领取,会在飞书进行同步的跟新。

文章目录

    • 📖 写在前面
      • 夏天要来了 秋招还会远吗?
    • 🍊 01.LYA 的魔法宝石
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 🌲 02.卢小姐的布料选购计划
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 🎧 03.LYA 的珍珠项链
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 🎀 写在最后
    • 🛖 这里介绍一下咱们的笔试打卡小屋
      • 🥰 打卡奖励
      • 🕰 每日学习安排
      • 📖 打卡小屋涉及题型
        • 基础算法
        • 基础数据结构
        • 搜索
        • 动态规划 & 贪心 & 数论

📖 写在前面

夏天要来了 秋招还会远吗?

前不久春招也算是圆满结束咯,大家有拿到心仪的 offer吗?
接下来互联网的秋招也快来啦,小伙伴们有开始准备了吗?
本次给大家带来24届秋招 阿里系 的笔试题目三语言解析(Java/Python/Cpp)

文末有清隆学长的笔试陪伴打卡小屋活动介绍:
✨丰富的打卡奖励等你来领哦,大厂笔试题汇总笔试面试经验贴算法笔试模版
💽 有兴趣的小伙伴们也可以了解一下,不要错过啦~

🍊 01.LYA 的魔法宝石

问题描述

LYA 是一位热爱收藏魔法宝石的女孩。她希望收集 n n n 颗宝石,并且要求这些宝石的魔法值两两不相等。此外,所有宝石的魔法值的最大公约数必须为 k k k

为了尽可能节省购买成本,LYA 希望选择魔法值之和最小的宝石组合。请你帮助 LYA 计算并输出宝石魔法值之和的最小值。

输入格式

输入包含两个正整数 n n n k k k,分别表示宝石的数量和魔法值的最大公约数。

输出格式

输出一个正整数,表示满足条件的宝石魔法值之和的最小值。

样例输入

3 2

样例输出

12

数据范围

1 ≤ n , k ≤ 1 0 5 1 \leq n, k \leq 10^5 1n,k105

题解

本题可以通过构造法来解决。为了让宝石的魔法值之和最小,我们可以将魔法值构造为 k k k 的倍数,并且按照从小到大的顺序选择。

具体步骤如下:

  1. 初始化结果变量 r e s res res 0 0 0,表示宝石魔法值之和。
  2. 1 1 1 n n n 遍历每个宝石:
    • 计算当前宝石的魔法值 t e m p = i × k temp = i \times k temp=i×k
    • t e m p temp temp 累加到结果变量 r e s res res 中。
  3. 输出结果变量 r e s res res 的值。

时间复杂度: O ( n ) O(n) O(n),其中 n n n 为宝石的数量。
空间复杂度: O ( 1 ) O(1) O(1)

参考代码

  • Python
n, k = map(int, input().split())
res = 0
for i in range(1, n + 1):
    temp = i * k
    res += temp
print(res)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        long res = 0;
        for (int i = 1; i <= n; i++) {
            long temp = i * k;
            res += temp;
        }
        System.out.println(res);
    }
}
  • Cpp
#include <iostream>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    long long res = 0;
    for (int i = 1; i <= n; i++) {
        long long temp = i * k;
        res += temp;
    }
    cout << res << endl;
    return 0;
}

🌲 02.卢小姐的布料选购计划

问题描述

卢小姐是一位服装设计师,她计划从一家面料商那里购买一段布料用于设计新款连衣裙。商家提供了一卷总长为 n n n 米的布料,但其中只有某些区间的布料质地符合要求。

商家允许卢小姐从这卷布料中选择一段长度为 k k k 米的连续区间购买。卢小姐希望在选定的区间内,符合要求的布料段总长度尽可能长。请你帮助卢小姐计算,最优方案下可以购得多少米符合要求的布料。

输入格式

第一行输入三个正整数 n , m , k n,m,k n,m,k,分别代表布卷的总长度、布卷上符合要求的布料段数量以及卢小姐计划购买的布料长度。

接下来的 m m m 行,每行输入两个正整数 l i , r i l_i,r_i li,ri,表示第 i i i 段符合要求的布料的起始位置和终止位置(单位:米)。

输出格式

输出一个整数,表示最优方案下可以购得的符合要求的布料总长度。

样例输入

10 3 6
1 3
4 5
7 9

样例输出

4

数据范围

  • 1 ≤ k ≤ n ≤ 1 0 9 1 \leq k \leq n \leq 10^9 1kn109
  • 1 ≤ m ≤ 1 0 5 1 \leq m \leq 10^5 1m105
  • 0 ≤ l i < r i ≤ n 0 \leq l_i < r_i \leq n 0li<rin
  • 符合要求的布料段之间互不重叠。

题解

本题可以使用双指针滑动窗口的方法求解。我们可以枚举购买布料的左端点,并维护一个右端点,使得当前窗口内的布料长度不超过 k k k。在枚举过程中,我们统计窗口内符合要求的布料段长度之和,并更新答案。

具体步骤如下:

  1. 将所有符合要求的布料段按照起始位置从小到大排序。
  2. 初始化左右指针 l e f t left left r i g h t right right,表示当前枚举的区间范围。
  3. 遍历布料段,将右指针 r i g h t right right 不断右移,直到当前区间长度超过 k k k 或遍历完所有布料段。
  4. 统计当前区间内符合要求的布料段长度之和 c o v e r cover cover,更新答案。
  5. 如果右指针 r i g h t right right 已经到达最后一个布料段,直接更新答案;否则,计算当前区间右端点与下一个布料段左端点之间的空白部分长度 r e m a i n remain remain,更新答案为 m a x ( a n s , c o v e r + r e m a i n ) max(ans,cover+remain) max(ans,cover+remain)
  6. 将左指针 l e f t left left 右移一个布料段,同时将 c o v e r cover cover 减去对应的布料段长度,继续枚举下一个区间。

时间复杂度为 O ( m log ⁡ m ) O(m \log m) O(mlogm),其中排序的时间复杂度为 O ( m log ⁡ m ) O(m \log m) O(mlogm),双指针遍历的时间复杂度为 O ( m ) O(m) O(m)。空间复杂度为 O ( m ) O(m) O(m)

参考代码

  • Python
class Solution:
    def maxCoverLength(self, n: int, m: int, k: int, segments: List[List[int]]) -> int:
        segments.sort()
        ans = cover = 0
        left = right = 0
        
        while right < m:
            while right < m and segments[right][1] - segments[left][0] <= k:
                cover += segments[right][1] - segments[right][0]
                right += 1
            
            if right == m:
                ans = max(ans, cover)
            else:
                remain = max(0, segments[left][0] + k - segments[right][0])
                ans = max(ans, cover + remain)
            
            cover -= segments[left][1] - segments[left][0]
            left += 1
        
        return ans
  • Java
class Solution {
    public int maxCoverLength(int n, int m, int k, int[][] segments) {
        Arrays.sort(segments, (a, b) -> a[0] - b[0]);
        int ans = 0, cover = 0;
        int left = 0, right = 0;
        
        while (right < m) {
            while (right < m && segments[right][1] - segments[left][0] <= k) {
                cover += segments[right][1] - segments[right][0];
                right++;
            }
            
            if (right == m) {
                ans = Math.max(ans, cover);
            } else {
                int remain = Math.max(0, segments[left][0] + k - segments[right][0]);
                ans = Math.max(ans, cover + remain);
            }
            
            cover -= segments[left][1] - segments[left][0];
            left++;
        }
        
        return ans;
    }
}
  • Cpp
class Solution {
public:
    int maxCoverLength(int n, int m, int k, vector<vector<int>>& segments) {
        sort(segments.begin(), segments.end());
        int ans = 0, cover = 0;
        int left = 0, right = 0;
        
        while (right < m) {
            while (right < m && segments[right][1] - segments[left][0] <= k) {
                cover += segments[right][1] - segments[right][0];
                right++;
            }
            
            if (right == m) {
                ans = max(ans, cover);
            } else {
                int remain = max(0, segments[left][0] + k - segments[right][0]);
                ans = max(ans, cover + remain);
            }
            
            cover -= segments[left][1] - segments[left][0];
            left++;
        }
        
        return ans;
    }
};

🎧 03.LYA 的珍珠项链

问题描述

LYA 有一条由 n n n 颗不同颜色珍珠串成的项链。她想通过改变其中某一颗珍珠的颜色来提升项链的美观度。根据专家的建议,项链的美观度等于任意连续的珍珠子串中,各颜色出现次数的最大值。

现在给定项链上每颗珍珠的颜色,以及 LYA 可以将某颗珍珠改变成的目标颜色,请你计算改变后项链的最大美观度是多少?

输入格式

第一行包含一个正整数 t t t,表示项链的条数。

接下来对于每条项链,第一行包含两个正整数 n n n c c c,分别表示项链的长度和目标颜色。第二行包含 n n n 个正整数 a 1 , a 2 , ⋯   , a n a_1, a_2, \cdots, a_n a1,a2,,an,表示初始时项链上每颗珍珠的颜色。

输出格式

对于每条项链,输出一行一个整数,表示改变后项链的最大美观度。

样例输入

3
5 10
5 -1 -5 -3 2
2 -3
-5 -2
6 10
4 -2 -11 -1 4 -1

样例输出

15
-2
15

数据范围

  • 1 ≤ t ≤ 1 0 5 1 \leq t \leq 10^5 1t105
  • 1 ≤ n ≤ 2 × 1 0 5 1 \leq n \leq 2 \times 10^5 1n2×105
  • − 1 0 9 ≤ c , a i ≤ 1 0 9 -10^9 \leq c, a_i \leq 10^9 109c,ai109
  • 所有项链的总长度不超过 2 × 1 0 5 2 \times 10^5 2×105

题解

本题可以使用动态规划求解。设 d p [ i ] [ 0 ] dp[i][0] dp[i][0] 表示不改变第 i i i 颗珍珠颜色的最大美观度, d p [ i ] [ 1 ] dp[i][1] dp[i][1] 表示将第 i i i 颗珍珠改变为目标颜色的最大美观度。则有以下状态转移方程:

d p [ i ] [ 0 ] = max ⁡ ( d p [ i − 1 ] [ 0 ] + a i , a i ) d p [ i ] [ 1 ] = max ⁡ ( d p [ i − 1 ] [ 0 ] + c , c , d p [ i − 1 ] [ 1 ] + a i , a i ) \begin{aligned} dp[i][0] &= \max(dp[i-1][0] + a_i, a_i) \\ dp[i][1] &= \max(dp[i-1][0] + c, c, dp[i-1][1] + a_i, a_i) \end{aligned} dp[i][0]dp[i][1]=max(dp[i1][0]+ai,ai)=max(dp[i1][0]+c,c,dp[i1][1]+ai,ai)

最终答案为 max ⁡ ( d p [ n − 1 ] [ 0 ] , d p [ n − 1 ] [ 1 ] ) \max(dp[n-1][0], dp[n-1][1]) max(dp[n1][0],dp[n1][1])

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

参考代码

  • Python
t = int(input())
for _ in range(t):
    n, c = map(int, input().split())
    a = list(map(int, input().split()))
    
    dp = [[0] * 2 for _ in range(n)]
    dp[0][0] = a[0]
    dp[0][1] = c
    res = max(dp[0])
    
    for i in range(1, n):
        dp[i][0] = max(dp[i-1][0] + a[i], a[i])
        dp[i][1] = max(dp[i-1][0] + c, c, dp[i-1][1] + a[i], a[i])
        res = max(res, dp[i][0], dp[i][1])
    
    print(res)
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            int n = sc.nextInt(), c = sc.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            System.out.println(maxBeauty(a, c));
        }
    }
    
    private static long maxBeauty(int[] a, int c) {
        int n = a.length;
        long[][] dp = new long[n][2];
        dp[0][0] = a[0];
        dp[0][1] = c;
        long res = Math.max(dp[0][0], dp[0][1]);
        
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i-1][0] + a[i], a[i]);
            dp[i][1] = Math.max(Math.max(dp[i-1][0] + c, c), 
                               Math.max(dp[i-1][1] + a[i], a[i]));
            res = Math.max(res, Math.max(dp[i][0], dp[i][1]));
        }
        
        return res;
    }
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;

long maxBeauty(vector<int>& a, int c) {
    int n = a.size();
    vector<vector<long>> dp(n, vector<long>(2));
    dp[0][0] = a[0];
    dp[0][1] = c;
    long res = max(dp[0][0], dp[0][1]);
    
    for (int i = 1; i < n; i++) {
        dp[i][0] = max(dp[i-1][0] + a[i], (long)a[i]);
        dp[i][1] = max(max(dp[i-1][0] + c, (long)c), 
                       max(dp[i-1][1] + a[i], (long)a[i]));
        res = max(res, max(dp[i][0], dp[i][1]));
    }
    
    return res;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, c;
        cin >> n >> c;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        cout << maxBeauty(a, c) << endl;
    }
    return 0;
}

🎀 写在最后

🛖 这里介绍一下咱们的笔试打卡小屋

在这里插入图片描述

✨ 打卡小屋旨在陪伴大家,养成每日学习的好习惯。在这里,你可以:

  • 🤝 与备战笔试的小伙伴相识,找到志同道合的学习小组
  • 📝 通过写题解,巩固做题思路,养成良好的记录习惯
  • 💡 系统掌握常考算法和数据结构,了解互联网笔试难度
  • 🎁 坚持打卡,获得丰厚奖励,激励自己持之以恒

🥰 打卡奖励

打卡时长奖励内容
7天任选一家最新互联网笔试真题 x 1 (价值29.9r)
14天任选一家最新互联网笔试真题 x 3 + 笔试面试经验贴
21天任选一家最新互联网笔试真题 x 5 + 清隆三语言算法模版
28天最新互联网大厂笔试真题汇总(价值199r) + 华为OD机试训练营 (价值89r)

7天打卡即可值回票价,心动不如行动!

🕰 每日学习安排

小屋将在每日上午发放打卡题目,包括:

  • 一道算法模版题,帮助大家掌握常用算法套路
  • 根据算法模版,精选一道对应的大厂笔试真题,巩固算法应用

让我们一起直击笔试重点,攻克常考题型!

📖 打卡小屋涉及题型

小屋从零基础出发,涵盖笔试常考知识点:

基础算法
  • 自定义排序
  • 二分
  • 前缀和
  • 差分
  • 双指针
基础数据结构
  • 栈 & 单调栈
  • 队列 & 单调队列
  • 并查集
  • 优先队列(堆)
搜索
  • DFS & BFS 基础应用
  • 树的遍历
  • 基础图论
动态规划 & 贪心 & 数论
  • 快速幂
  • 组合数
  • 质数 & 因数
  • 位运算
  • 基础动态规划
  • 常见贪心

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高频小信号放大器的分类与质量指标

目录 分类 质量指标 增益 通频带 选择性 稳定性 噪声系数 分类 质量指标 增益 电压与功率的放大倍数。 通频带 放大效果比较好的频率范围。 选择性 放大目标信号以滤除其他信号的综合能力。 稳定性 噪声系数

chatglm4本地部署详解

下载地址 模型下载地址&#xff1a;GitHub - THUDM/GLM-4: GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型 已经训练好的数据下载地址&#xff1a; https://huggingface.co/THUDM/glm-4-9b-chat-1m/tree/main 测试主机配置 cpu&#xff1a;E…

pdf转图片,pdf转图片在线转

pdf转图片的方法&#xff0c;对于许多人来说可能是一个稍显陌生的操作。然而&#xff0c;在日常生活和工作中&#xff0c;我们有时确实需要将pdf文件转换为图片格式&#xff0c;以便于在特定的场合或平台上进行分享、展示或编辑。以下&#xff0c;我们将详细介绍一个pdf转成图片…

【网络安全的神秘世界】AppScan安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 https://www.hcl-software.com/appscan AppScan是一种综合型漏洞扫描工具&#xff0c;采用SaaS解决方案&#xff0c;它将所以测试功能整合到一个服务中&a…

Java基础——网络编程(一)

初识网络编程 网络编程&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件…… BS架构的优缺点&#xff1a; 1、不需要开发客户端&#xff0c;只需要页面服务端 2、…

Redis 键空间迭代 Scan

引言 在平时线上Redis维护工作中&#xff0c;有时候需要从Redis实例成千上万的key中找出特定前缀的key列表来手动处理数据&#xff0c;可能是修改他的值&#xff0c;也可能是删除key。 Redis提供了一个简单暴力的指令keys用来列出所有满足特定正则字符串规则的key。 127.0.0…

26.1 WEB框架介绍

1. Web应用程序 1.1 应用程序有两种模式 应用程序的架构模式主要分为两种: C/S (客户端/服务器端)和B/S(浏览器/服务器端). * 1. C/S模式, 即客户端/服务器模式(Client/Server Model): 是一种分布式计算模式.它将应用程序的功能划分为客户端和服务器端两部分.在这种模式下, 客…

几种经典排序算法

几种经典排序算法 插入排序折半插入排序法 选择排序冒泡排序希尔排序堆排序二路归并排序快速排序 在介绍排序之前&#xff0c;先来说说&#xff0c;研究不同的排序主要是要研究他们的哪些不同&#xff1a; 时间性能。即排序过程中元素之间的比较次数与元素移动次数。我们此次讨…

【最新鸿蒙应用开发】——鸿蒙中的“Slot插槽”?@BuilderParam

构建函数-BuilderParam 传递 UI 1. 引言 BuilderParam 该装饰器用于声明任意UI描述的一个元素&#xff0c;类似slot占位符。 简而言之&#xff1a;就是自定义组件允许外部传递 UI Entry Component struct Index {build() {Column({ space: 15 }) {SonCom() {// 直接传递进来…

IPv6 ND 协议功能概述

ND 协议功能概述 ND&#xff08;Neighbor Discovery&#xff0c;邻居发现&#xff09;协议是 IPv6 的一个关键协议&#xff0c;它综合了 IPv4 中的 ARP&#xff0c;ICMP 路由发现和 ICMP 重定向等协议&#xff0c;并对它们做了改进。 作为 IPv6 的基础性协议&#xff0c;ND 协…

ppt添加圆角矩形,并调整圆角弧度方法

一、背景 我们看的论文&#xff0c;许多好看的图都是用PPT做的&#xff0c;下面介绍用ppt添加圆角矩形&#xff0c;并调整圆角弧度方法。 二、ppt添加圆角矩形&#xff0c;并调整圆角弧度 添加矩形&#xff1a; 在顶部工具栏中&#xff0c;点击“插入”选项卡。 在“插图”…

冒泡排序知识点

排序的基本概念 排序是计算机内经常进行的一种操作&#xff0c;其目的是将一组“无序”的记录调整为“有序”的记录序列。 常用的排序例子 8 7 1 5 4 2 6 3 9 把上面的这个无序序列变为有序&#xff08;升序或者降序&#xff09;序列的过程。 1 2 3 4 5 6 7 8 9&#xff0…

Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求

测试表现层的代码如何测试 加载测试的专用属性 首先写一个测试 假定我们进行测试的时候要加一些属性 要去修改一些属性 我们可以写一个只在本测试有效的测试 写在配置里 测试 打印输出 我们把配置文件里面的配置注释掉后 我们同样可以启动 package com.example.demo;impo…

代码随想录——组合总和Ⅱ(Leetcode 40)需要回顾

题目链接 回溯 本题的难点在于&#xff1a;集合&#xff08;数组candidates&#xff09;有重复元素&#xff0c;但还不能有重复的组合。 思想&#xff1a;元素在同一个组合内是可以重复的&#xff0c;怎么重复都没事&#xff0c;但两个组合不能相同。所以要去重的是同一树…

购物车店铺列表查询流程

购物车店铺列表查询流程 购物车结算流程图

嵌入式门槛高不高,工资怎么样?

一般来说&#xff0c;嵌入式岗位的准入门槛其实并不是特别高。通常情况下&#xff0c;只要能够熟练掌握 C 语言编程以及单片机相关知识&#xff0c;就能够去制作一些较为简单的电子产品&#xff0c;由此可见其门槛相对而言是比较低的&#xff0c;相应的薪水可能也不会特别高。 …

I2C 总线通信技术基础

1.0 I2C 技术基础 使用总线的目的&#xff1a;采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高&#xff0c;同时&#xff0c;系统的更改和扩充变的极为容易。 通信中常用的串行拓展总线 I2C&#xff08;Inter-Integrated Circuit &#xff09;总线…

C语言程序设计-6 循环控制

C语言程序设计-6 循环控制 循环结构是程序中一种很重要的结构。其特点是&#xff0c;在给定条件成立时&#xff0c;反复执行某程序 段&#xff0c;直到条件不成立为止。给定的条件称为循环条件&#xff0c;反复执行的程序段称为循环体。&#xff23;语 言提供了多种循环语句&a…

计算机网络知识点全面总结回顾

物理层 OSI模型&#xff1a;数据链路层&#xff08;流量控制&#xff09;&#xff0c;从传输层开始端到端&#xff1b;每一层的元素都称为实体&#xff0c;同一层的是对等实体&#xff1b;三个重要概念&#xff1a;服务&#xff08;下层为上层提供调用&#xff09;&#xff0c…

【Linux】进程间通信1——管道概念,匿名管道

1.进程间通信介绍 进程是计算机系统分配资源的最小单位&#xff08;严格说来是线程&#xff09;。每个进程都有自己的一部分独立的系统资源&#xff0c;彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作&#xff0c;才有了进程间通信。 进程间通信&#xff0c;顾名…