【饿了么笔试题汇总】-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 = 0for a in A:if a == sumB - sumA:ans += 1print(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] * 31for x in gem:for bit in range(31):if (x >> bit) & 1:cnt[bit] += 1atk = 0        for pos in range(30, -1, -1):if cnt[pos] > 0:atk |= 1 << poscnt[pos] -= 1if cnt[pos] > 0:atk |= (1 << pos) - 1breakprint(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领取,会在飞书进行同步的跟新。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB简介、下载及安装

1、MATLAB简介 MATLAB&#xff08;Matrix Laboratory&#xff09;是由MathWorks公司开发的一款强大的商业数学软件环境&#xff0c;主要用于数值计算、算法开发、数据可视化、数据分析和基于模型的设计等多种用途。MATLAB被广泛应用在学术研究、工程计算、经济建模、控制系统设…

Tuxera NTFS for Mac2023绿色免费版 免费的ntfs for mac 免费读写硬盘U盘工具

Tuxera NTFS 2023 Mac免费版是款适合Mac用户使用的磁盘读写工具。Tuxera NTFS 2023 Mac可以很好的帮助用户在Mac上打开、编辑、复制、移动或删除存储在Windows NTFS格式的USB驱动器上的文件。并且Tuxera NTFS 2023 Mac还可以无阻碍地使用各种文件系统磁盘&#xff0c;还能解决磁…

WebKit揭秘:从内部结构到应用程序开发

文章目录 WebKit结构简介核心模块其他组件多进程架构&#xff08;WebKit2&#xff09; Wekbit做了什么&#xff1f;应用程序如何利用 Webkit WebKit结构简介 WebKit是一个开源的浏览器引擎&#xff0c;它由多个模块组成&#xff0c;这些模块协同工作以提供Web内容的渲染和交互…

配置plsql链接Oracle数据库(新手)

配置plsql链接Oracle数据库 安装Oracle客户端 、安装plsql客户端并激活 配置tnsnames.ora文件&#xff08;路径D:\app\peter\Oracle\InstantClient\network\admin根据你的实际路径设置&#xff09; 配置文件如下 # tnsnames.ora Network Configuration File: D:\app\peter\O…

每日五道java面试题之消息中间件MQ篇(二)

目录&#xff1a; 第一题. RabbitMQ的工作模式第二题. 如何保证RabbitMQ消息的顺序性&#xff1f;第三题. 消息如何分发&#xff1f;第四题. 消息怎么路由&#xff1f;第五题. 如何保证消息不被重复消费&#xff1f;或者说&#xff0c;如何保证消息消费时的幂等性&#xff1f; …

PostgreSql 01 安装,创建用户,创建数据库,创建关系

01.安装postgresql postgreSql 是在linux上 去官网找按照的方式 选择好postgreSql 的版本&#xff0c;已经Linux的发行版本 拿到命令&#xff0c;直接扔到Linux中运行即可 # 下载PGSQL的rpm包 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpm…

Nacos 配置管理(黑马程序员)

统一配置管理&#xff1a; 1在 Nacos 中添加配置信息&#xff1a; 启动nacos服务&#xff0c;在bin目录下运行cmd,输入startup.cmd -m standalone 访问nacos服务&#xff0c;点击添加配置管理&#xff0c;进行如下配置&#xff08;控制日期格式&#xff09; 2 引入 Nacos 的…

LVS、HAProxy

集群&#xff1a;将很多个机器组织到一起&#xff0c;作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类&#xff1a;负载均衡集群&#xff1a;Load Balance。高可用集群&#xff1a;High Available。高性能集群&#xff1a;High Performance Com…

The Sandbox Eternal Fandom 土地销售活动开始!通过 K-Verse 让玩家更接近喜爱的品牌

为粉丝而生 The Sandbox 中最受欢迎的街区之一又添新成员。”K-Verse&#xff1a;Eternal Fandom "土地销售活动于 3 月 27 日开始&#xff0c;玩家可以在The Sandbox中这个令人向往的街区购买土地。这标志着The Sandbox第三次以韩国为主题的土地促销&#xff0c;我们将继…

Linux ssh免密登录配置

步骤 在本地机器上生成公钥和私钥对。将本地公钥复制到远程机器的~/.ssh/authorized_keys文件中。 实现1 在服务器上生成SSH密钥对 ssh-keygen -t rsa -f /home/id_rsa1ssh-keygen: 这是一个用于生成、管理和转换 SSH 密钥的 OpenSSH 工具。-t rsa: 用于指定要生成的密钥类…

AI资讯2024-04-02 | 前微软副总裁姜大昕携「阶跃星辰」入场,出手即万亿参数大模型!

关注文章底部公众号获取每日AI新闻,以及各种好玩的黑科技,如AI换脸,AI数字人,AI生成视频等工具 阶跃星辰发布万亿参数大模型 终于!国内大模型创业公司最后一位强实力玩家入场——阶跃星辰。它是由微软前全球副总裁姜大昕所创办,公司名称也来源于,发了三个大模型:Step-…

力扣17 电话号码的字母组合 Java版本

文章目录 题目描述代码 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a…