【饿了么笔试题汇总】-2024-04-02-饿了么春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员

✨ 本系列打算持续跟新饿了么近期的春秋招笔试题汇总~

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

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

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

文章目录

    • 01.K小姐挑战数组相似
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 02.切绳子
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 03.卢小姐的魔法强化
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 写在最后
    • 📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

01.K小姐挑战数组相似

问题描述

K小姐正在设计一个全新的拼图游戏,她定义了一种"相似"的概念。她说两个数组是相似的,当且仅当两个数组的所有元素之和相等。

现在K小姐有两个长度分别为 n n n m m m 的数组 A A A B B B。她想知道,最多有多少个数组 A A A 中的元素 A i A_i Ai,如果将其翻倍,就能使得数组 A A A 和数组 B B B 相似。

输入格式

第一行包含两个正整数 n , m n, m n,m,分别表示数组 A A A B B B 的长度。

第二行共 n n n 个用空格分开的整数 A 1 , A 2 , . . . , A n A_1, A_2, ..., A_n A1,A2,...,An,表示数组 A A A

第三行共 m m m 个用空格分开的整数 B 1 , B 2 , . . . , B m B_1, B_2, ..., B_m B1,B2,...,Bm,表示数组 B B B

输出格式

输出一个整数,表示最多有多少个数组 A A A 中的元素 A i A_i Ai,如果将其翻倍,就能使得数组 A A A 和数组 B B B 相似。

样例输入

3 4
1 2 3
4 3 2 1

样例输出

2

数据范围

  • 1 ≤ n , m ≤ 1 0 5 1 \leq n, m \leq 10^5 1n,m105
  • − 1 0 9 ≤ A i , B j ≤ 1 0 9 -10^9 \leq A_i, B_j \leq 10^9 109Ai,Bj109

题解

我们可以先计算出数组 A A A B B B 的元素之和,分别记为 s u m A sumA sumA s u m B sumB sumB。如果存在某个 A i A_i Ai 满足 s u m A + A i = s u m B sumA + A_i = sumB sumA+Ai=sumB,那么将 A i A_i Ai 翻倍后,数组 A A A B B B 就相似了。

因此,我们只需要遍历数组 A A A,对于每个 A i A_i Ai,判断是否有 A i = s u m B − s u m A A_i = sumB - sumA Ai=sumBsumA 成立。如果成立,就将答案加一。最后输出答案即可。

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

参考代码

  • Python
def solution():
    n, m = map(int, input().split())
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))

    sumA = sum(A)
    sumB = sum(B)
    ans = 0

    for a in A:
        if a == sumB - sumA:
            ans += 1

    print(ans)

if __name__ == "__main__":
    solution()
  • Java
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        long[] A = new long[n];
        long[] B = new long[m];

        long sumA = 0;
        for (int i = 0; i < n; i++) {
            A[i] = scanner.nextLong();
            sumA += A[i];
        }

        long sumB = 0;
        for (int i = 0; i < m; i++) {
            B[i] = scanner.nextLong();
            sumB += B[i];
        }

        int ans = 0;
        for (long a : A) {
            if (a == sumB - sumA) {
                ans++;
            }
        }

        System.out.println(ans);
    }
}
  • Cpp
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<long long> A(n), B(m);

    long long sumA = 0;
    for (int i = 0; i < n; i++) {
        cin >> A[i];
        sumA += A[i];
    }

    long long sumB = 0;
    for (int i = 0; i < m; i++) {
        cin >> B[i];
        sumB += B[i];
    }

    int ans = 0;
    for (long long a : A) {
        if (a == sumB - sumA) {
            ans++;
        }
    }

    cout << ans << endl;
    return 0;
}

02.切绳子

问题描述

K 小姐有 n n n 根绳子,从 1 1 1 n n n 编号,第 i i i 根绳子的长度为 a i a_i ai。她希望通过切割操作,使所有绳子长度相等。每次切割操作可以选择一根长度为 s s s 的绳子,将其切成长度分别为 x x x y y y 的两段,其中 x x x y y y 均为正整数且满足 x + y = s x+y=s x+y=s。K 小姐最多进行 k k k 次切割操作。请你帮她判断是否可以通过不超过 k k k 次切割操作,使所有绳子长度相等。

输入格式

输入包含多组测试数据。第一行包含一个正整数 T T T 1 ≤ T ≤ 1 0 4 1 \leq T \leq 10^4 1T104),表示测试数据的组数。

对于每组测试数据:

  • 第一行包含两个正整数 n n n 1 ≤ n < 1 0 5 1 \leq n < 10^5 1n<105)和 k k k 0 ≤ k ≤ 1 0 14 0 \leq k \leq 10^{14} 0k1014),分别表示绳子的数量和最多允许的切割操作次数。
  • 第二行包含 n n n 个正整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109),表示每根绳子的初始长度。

保证所有测试数据中 n n n 的总和不超过 1 0 5 10^5 105

输出格式

对于每组测试数据,如果可以通过不超过 k k k 次切割操作使所有绳子长度相等,则输出 YES,否则输出 NO

样例输入

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

样例输出

YES
NO

数据范围

  • 1 ≤ T ≤ 1 0 4 1 \leq T \leq 10^4 1T104
  • 1 ≤ n < 1 0 5 1 \leq n < 10^5 1n<105
  • 0 ≤ k ≤ 1 0 14 0 \leq k \leq 10^{14} 0k1014
  • 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109
  • 所有测试数据中 n n n 的总和不超过 1 0 5 10^5 105

题解

本题可以使用最大公约数(GCD)来求解。我们可以发现,如果所有绳子最终长度相等,那么它们的长度一定是所有初始绳子长度的最大公约数的倍数。因此,我们可以先求出所有绳子长度的最大公约数,然后计算每根绳子需要切割的次数,看是否不超过 k k k 即可。

具体步骤如下:

  1. 求出所有绳子长度的最大公约数 g g g
  2. 对于每根绳子,计算它需要切割的次数,即 a i / g − 1 a_i / g - 1 ai/g1
  3. 将所有绳子需要切割的次数相加,如果不超过 k k k,则输出 YES,否则输出 NO

时间复杂度为 O ( n log ⁡ a max ⁡ ) O(n \log a_{\max}) O(nlogamax),其中 a max ⁡ a_{\max} amax 为绳子长度的最大值。空间复杂度为 O ( 1 ) O(1) O(1)

参考代码

  • Python
def gcd(x, y):
    return x if y == 0 else gcd(y, x % y)

T = int(input())
for _ in range(T):
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    g = a[0]
    for i in range(1, n):
        g = gcd(g, a[i])
    cnt = sum(x // g - 1 for x in a)
    print("YES" if cnt <= k else "NO")
  • Java
import java.io.*;
import java.util.*;

public class Main {
    static int gcd(int x, int y) {
        return y == 0 ? x : gcd(y, x % y);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while (T-- > 0) {
            int n = sc.nextInt();
            long k = sc.nextLong();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            int g = a[0];
            for (int i = 1; i < n; i++) {
                g = gcd(g, a[i]);
            }
            long cnt = 0;
            for (int x : a) {
                cnt += x / g - 1;
            }
            System.out.println(cnt <= k ? "YES" : "NO");
        }
    }
}
  • Cpp
#include <iostream>
using namespace std;

int gcd(int x, int y) {
    return y == 0 ? x : gcd(y, x % y);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int T;
    cin >> T;
    while (T--) {
        int n;
        long long k;
        cin >> n >> k;
        int g = 0;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            g = i == 0 ? x : gcd(g, x);
        }
        long long cnt = 0;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            cnt += x / g - 1;
        }
        cout << (cnt <= k ? "YES" : "NO") << '\n';
    }

    return 0;
}

03.卢小姐的魔法强化

问题描述

卢小姐是一位魔法少女,她拥有一把初始攻击力为 0 0 0 的魔法棒。现在,她面前有 n n n 块魔法石,每块魔法石都可以用于强化她的魔法棒。第 i i i 块魔法石有一个强化上限 a i a_i ai

当卢小姐使用第 i i i 块魔法石强化她的魔法棒时,她需要选择一个不超过强化上限 a i a_i ai 的非负整数 x x x 作为强化系数。假设卢小姐当前的魔法棒攻击力为 k k k,那么强化后的攻击力将变为 k ∣ x k \mid x kx(其中 ∣ \mid 表示按位或操作)。每块魔法石只能使用一次,用后即失效。

卢小姐想知道,利用这 n n n 块魔法石,她的魔法棒最多能达到多大的攻击力。

输入格式

输入包含多组测试数据。

第一行输入一个正整数 T T T 1 ≤ T ≤ 1 0 4 1 \leq T \leq 10^4 1T104),表示测试数据的组数。

接下来,对于每组测试数据:

  • 第一行输入一个正整数 n n n 1 ≤ n ≤ 2 × 1 0 5 1 \leq n \leq 2 \times 10^5 1n2×105),表示魔法石的数量。
  • 第二行输入 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an 0 ≤ a i ≤ 1 0 9 0 \leq a_i \leq 10^9 0ai109),表示每块魔法石的强化上限。

保证所有测试数据中 n n n 的总和不超过 2 × 1 0 5 2 \times 10^5 2×105

输出格式

输出包含 T T T 行,每行一个整数,表示对应测试数据中卢小姐的魔法棒能达到的最大攻击力。

样例输入

2
5
2 3 3 3 6
3
1 0 0

样例输出

7
1

数据范围

  • 1 ≤ T ≤ 1 0 4 1 \leq T \leq 10^4 1T104
  • 1 ≤ n ≤ 2 × 1 0 5 1 \leq n \leq 2 \times 10^5 1n2×105
  • 0 ≤ a i ≤ 1 0 9 0 \leq a_i \leq 10^9 0ai109
  • 所有测试数据中 n n n 的总和不超过 2 × 1 0 5 2 \times 10^5 2×105

题解

我们可以用贪心的思想来解决这个问题。对于每一个二进制位,我们优先使用能够强化该位的魔法石。如果该位已经被强化,我们就不需要再使用其他能够强化该位的魔法石了。

具体步骤如下:

  1. 统计每个二进制位上有多少块魔法石能够强化该位。
  2. 从高位到低位遍历每个二进制位:
    • 如果当前位上有能够强化该位的魔法石,我们就使用其中一块,将答案的该位置为 1 1 1
    • 如果当前位上还有剩余的能够强化该位的魔法石,我们可以使用它们来强化答案的低位。具体地,我们可以将答案的低位全部置为 1 1 1,然后退出遍历。

时间复杂度为 O ( n log ⁡ a max ⁡ ) O(n \log a_{\max}) O(nlogamax),其中 a max ⁡ a_{\max} amax 为魔法石强化上限的最大值。空间复杂度为 O ( 1 ) O(1) O(1)

参考代码

  • Python
def solve():
    n = int(input())
    gem = list(map(int, input().split()))
    cnt = [0] * 31
    for x in gem:
        for bit in range(31):
            if (x >> bit) & 1:
                cnt[bit] += 1
    atk = 0        
    for pos in range(30, -1, -1):
        if cnt[pos] > 0:
            atk |= 1 << pos
            cnt[pos] -= 1
            if cnt[pos] > 0:
                atk |= (1 << pos) - 1
                break
    print(atk)

T = int(input())    
for case in range(T):
    solve()
  • Java
import java.io.*;
import java.util.*;

public class MagicGirl {
    static void solve(Scanner sc) {
        int n = sc.nextInt();
        int[] cnt = new int[31];
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            for (int bit = 0; bit < 31; bit++) {
                if (((x >> bit) & 1) == 1) {
                    cnt[bit]++;
                }
            }
        }
        int atk = 0;
        for (int pos = 30; pos >= 0; pos--) {
            if (cnt[pos] > 0) {
                atk |= 1 << pos;
                cnt[pos]--;
                if (cnt[pos] > 0) {
                    atk |= (1 << pos) - 1;
                    break;
                }
            }
        }
        System.out.println(atk);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int case = 0; case < T; case++) {
            solve(sc);
        }
    }
}
  • Cpp
#include <iostream>
using namespace std;

void solve() {
    int n;
    cin >> n;
    int cnt[31] = {0};
    for (int i = 0; i < n; i++) {
        int x; 
        cin >> x;
        for (int bit = 0; bit < 31; bit++) {
            if ((x >> bit) & 1) {
                cnt[bit]++; 
            }
        }
    }
    int atk = 0;
    for (int pos = 30; pos >= 0; pos--) {
        if (cnt[pos] > 0) {
            atk |= 1 << pos;
            cnt[pos]--;
            if (cnt[pos] > 0) {
                atk |= (1 << pos) - 1;
                break;
            }
        }
    }
    cout << atk << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int T; 
    cin >> T;
    for (int case = 0; case < T; case++) {
        solve();
    }

    return 0;
}

写在最后

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

在这里插入图片描述

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

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

相关文章

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)

算法学习——LeetCode力扣图论篇1 797. 所有可能的路径 797. 所有可能的路径 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特…

STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用 &#x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器&#xff09;描述 &#x1f4dd;DWT是属于处理器内核单元中的调试组件之一&#xff0c;由四个比较器组成。它们可配置为&#xff1a;硬件监视点或对ETM或PC采样器或数据地…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…

06 | Swoole 源码分析之 Coroutine 协程模块

首发原文链接&#xff1a;Swoole 源码分析之 Coroutine 协程模块 大家好&#xff0c;我是码农先森。 引言 协程又称轻量级线程&#xff0c;但与线程不同的是&#xff1b;协程是用户级线程&#xff0c;不需要操作系统参与。由用户显式控制&#xff0c;可以在需要的时候挂起、或…

回顾快速排序

快速排序 快速排序的核心&#xff1a; 找到一个key 通常左边的数比key小&#xff0c;右边的数比key大。 找key通常有三种方法&#xff1a; 1. 挖坑法&#xff1a; 代码实现&#xff1a; // int _pivot(int* a, int left, int right) {int begin left, end right;int in…

动态图学习新突破!最新SOTA实现性能全面升级,效率与精度兼得

现实世界中的许多图数据是动态变化的&#xff0c;比如社交网络、交通流量等。而传统的图学习方法通常处理的是静态图&#xff0c;这就导致它缺乏处理动态变化的能力&#xff0c;在适应性方面存在局限性。 相较之下&#xff0c;动态图学习能够捕捉到图数据的动态变化&#xff0…

MuJoCo 入门教程(一)

系列文章目录 前言 一、简介 MuJoCo 是多关节接触动力学&#xff08;Multi-Joint dynamics with Contact&#xff09;的缩写。它是一个通用物理引擎&#xff0c;旨在促进机器人、生物力学、图形和动画、机器学习以及其他需要快速、准确地仿真铰接结构与环境交互的领域的研究和开…

ssm016基于 Java Web 的校园驿站管理系统+jsp

校园驿站管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱&#xff0c;出…

阿里云优惠券如何领取使用?

阿里云是阿里巴巴旗下云计算及人工智能科技公司&#xff0c;提供云服务器、云数据库、云存储等云计算服务和云解决方案。为了吸引更多的用户&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将为大家详细介绍阿里云优惠券领取方法及使用教程&a…

Nginx 基础

文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是…

211基于matlab的多类结构动力学

基于matlab的多类结构动力学&#xff0c;凸轮机构、双凸轮、弦振动模拟、阻尼振动 、四连杆机构 、套杆运动 、三根弹簧作用的振子。程序已调通&#xff0c;可直接运行。 211 matlab 结构动力学 根弹簧作用的振子 - 小红书 (xiaohongshu.com)

javaweb学习(day10-服务器渲染技术)

一、基本介绍 1.前言 目前主流的技术是 前后端分离 (比如: Spring Boot Vue/React)JSP 技术使用在逐渐减少&#xff0c;但使用少和没有使用是两个意思&#xff0c;一些老项目和中小公司还在使用 JSP&#xff0c;工作期间&#xff0c;你很有可能遇到 JSPJSP 使用在减少(但是现…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…

阿赵UE学习笔记——24、动画播放控制

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。关于UE的动画系统&#xff0c;之前学习了很多&#xff0c;包括动画合成或者动画蒙太奇等&#xff0c;实际上最后得到的都是一个动画片段。那么这些动画片段&#xff0c;是需要怎样播放控制呢…

乐观锁解决超卖问题

3.6 乐观锁解决超卖问题 修改代码方案一、 VoucherOrderServiceImpl 在扣减库存时&#xff0c;改为&#xff1a; boolean success seckillVoucherService.update().setSql("stock stock -1") //set stock stock -1.eq("voucher_id", voucherId).eq(&q…

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的GPIO输出代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 在完成开发环境搭建之后&#xff0c;开始使用STM32GP…

TCP和UDP区别和使用场景

TCP 和 UDP 是计算机⽹络中两种常⽤的传输层协议&#xff0c;⽤于实现可靠传输和⽆连接传输。 TCP TCP&#xff08;Transmission Control Protocol&#xff09;是⼀种⾯向连接的、可靠的传输协议。它通过三次握⼿四次挥⼿进⾏连接和断开链接&#xff0c;保证数据的可靠性、…