【秋招笔试】9.02阿里国际秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

✨ 本系列打算持续跟新 春秋招笔试题

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

🍒 本专栏已收集 90+ 套笔试题,笔试真题 会在第一时间跟新

🍄 题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。

🧩 备战秋招还没订阅的朋友们可以冲一下啦,当试题收集至 100 套后,价格会进行一波调整~

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

🍠 阿里国际秋招笔试,来啦!!!

🍥 本次难度中等偏上,其中最后一题是状态压缩DP,没接触过的小伙伴会有点懵,第二题也有坑,没保证数组有序

1️⃣ 按照题意模拟,简单

2️⃣ 也是一道模拟题,但要注意,输入的位置不一定是有序的

3️⃣ 状态压缩DP,拿到题看到数据范围,如果平时做题比较多的朋友们应该已经能猜到做法了

📚 01.LYA的魔法能量转换

问题描述

LYA 是一位魔法师,她发现了一种神奇的能量转换方法。在她的魔法世界中,每个魔法物品都有一个能量值。LYA 可以通过特殊的魔法操作来改变这些能量值。

对于一个能量值为 的魔法物品,LYA 可以使用以下魔法操作:

  1. 计算 的所有数位之和。
  2. 将这个和加到 上,得到一个新的能量值。

LYA 想知道,从一个初始能量值开始,通过多少次魔法操作可以达到另一个目标能量值,或者是否根本无法达到。

输入格式

输入只有一行,包含三个整数 )。

表示魔法世界中的最大能量值, 是初始能量值, 是目标能量值。

输出格式

如果可以从能量值 通过魔法操作达到能量值 ,输出一个整数,表示最少需要的魔法操作次数。

如果无法达到目标能量值,输出 "NO"(不包含引号)。

样例输入

13 5 13

样例输出

3

样例解释

从能量值 5 开始:

  1. 5 + (5) = 10
  2. 10 + (1 + 0) = 11
  3. 11 + (1 + 1) = 13

需要 3 次魔法操作达到能量值 13。

数据范围

题解

按照题意模拟即可

步骤如下:

  1. 初始化操作次数 ans 为 0。
  2. u 不等于 vuv 都不超过 n 时,执行以下步骤: a. 如果 u 小于 v,对 u 执行魔法操作。 b. 如果 u 大于 v,对 v 执行魔法操作。 c. 增加操作次数 ans
  3. 如果最终 u 等于 v,输出操作次数 ans
  4. 如果无法达到目标值(即 uv 超过了 n),输出 "NO"。

参考代码

  • Python
def digit_sum(num):
    """计算数字各位之和"""
    return sum(int(d) for d in str(num))

def solve(n, u, v):
    ans = 0
    while u != v and max(u, v) <= n:
        if u < v:
            u += digit_sum(u)
        else:
            v += digit_sum(v)
        ans += 1
    return str(ans) if u == v else "NO"

# 读取输入
n, u, v = map(int, input().split())

# 输出结果
print(solve(n, u, v))
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int u = scanner.nextInt();
        int v = scanner.nextInt();
        
        System.out.println(solve(n, u, v));
    }
    
    static String solve(int n, int u, int v) {
        int ans = 0;
        while (u != v && Math.max(u, v) <= n) {
            if (u < v) {
                u += digitSum(u);
            } else {
                v += digitSum(v);
            }
            ans++;
        }
        return u == v ? String.valueOf(ans) : "NO";
    }
    
    static int digitSum(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}
  • Cpp
#include <iostream>
#include <string>
using namespace std;

int digitSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

string solve(int n, int u, int v) {
    int ans = 0;
    while (u != v && max(u, v) <= n) {
        if (u < v) {
            u += digitSum(u);
        } else {
            v += digitSum(v);
        }
        ans++;
    }
    return u == v ? to_string(ans) : "NO";
}

int main() {
    int n, u, v;
    cin >> n >> u >> v;
    cout << solve(n, u, v) << endl;
    return 0;
}

🪐 02.逃离机器城

问题描述

在未来的机器城中,一群可爱的精灵宠物被困在了一条长长的逃生通道里。为了逃离追捕他们的机器人,这些精灵宠物必须快速通过这条通道。

通道的长度为 ),机器人从位置 开始追赶,而精灵宠物从位置 )开始逃跑。当精灵宠物到达位置 时,就算成功逃脱。

然而,通道中布满了 个障碍物。精灵宠物需要花费时间来清除这些障碍物,而机器人则可以瞬间穿过。精灵宠物清除第 个障碍物需要 单位时间。无论是精灵宠物还是机器人,移动一格都需要 单位时间。

K小姐作为精灵宠物的训练师,她想知道她的宠物能否成功逃脱。你能帮助她计算出结果吗?

输入格式

第一行输入一个整数 ),表示测试数据的组数。

对于每组测试数据:

第一行输入三个整数 ),分别表示通道长度、障碍物数量和精灵宠物的初始位置。

第二行输入 个整数 ),表示每个障碍物的位置。保证障碍物不会出现在精灵宠物的初始位置,且障碍物之间不会重叠。

第三行输入 个整数 ),表示清除每个障碍物所需的时间。

保证所有测试数据中 的总和不超过

输出格式

对于每组测试数据,如果精灵宠物能够成功逃脱,输出一行 "YES",否则输出一行 "NO"。

样例输入

2
6 1 4
5
3
6 1 4
5
2

样例输出

NO
YES

数据范围

  • 所有测试数据中 的总和不超过

题解

模拟题 以下是几个关键点:

  1. 只需要关注精灵宠物前方的障碍物,因为它不会回头。

  2. 对于每个障碍物,计算精灵宠物到达该障碍物时,与机器人之间的距离差。

  3. 如果在某个障碍物处,机器人追上或超过了精灵宠物,那么精灵宠物就无法逃脱。

  4. 如果精灵宠物能够处理完所有障碍物且没有被追上,那么它就能成功逃脱。

具体实现步骤:

  1. 首先,对障碍物按位置排序。(重要!!)

  2. 找到第一个在精灵宠物前方的障碍物。

  3. 从这个障碍物开始,我们逐个计算精灵宠物处理完每个障碍物后,与机器人之间的距离差。

  4. 如果在任何时候距离差变为负数或零,说明机器人追上了精灵宠物,返回 "NO"。

  5. 如果精灵宠物处理完所有障碍物后仍未被追上,返回 "YES"。

参考代码

  • Python
def solve():
    m, n, k = map(int, input().split())
    a = list(map(int, input().split()))
    t = list(map(int, input().split()))
    
    # 将障碍物位置和清除时间组合并排序
    obstacles = sorted(zip(a, t))
    
    # 找到第一个在精灵宠物前方的障碍物
    idx = next((i for i, (pos, _) in enumerate(obstacles) if pos > k), -1)
    
    if idx == -1:
        return "YES"  # 没有障碍物在前方,可以直接逃脱
    
    last = obstacles[idx][0] - k + obstacles[idx][1]  # 初始距离差
    
    if last >= obstacles[idx][0] - 1:
        return "NO"  # 在第一个障碍物就被追上
    
    # 检查剩余的障碍物
    for i in range(idx + 1, n):
        last += obstacles[i][0] - obstacles[i-1][0] + obstacles[i][1]
        if last >= obstacles[i][0] - 1:
            return "NO"  # 被追上
    
    return "YES"  # 成功逃脱

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        while (T-- > 0) {
            solve(br);
        }
    }

    static void solve(BufferedReader br) throws IOException {
        String[] line = br.readLine()

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

学长刷题笔记 文章被收录于专栏

这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的

全部评论

相关推荐

09-09 20:45
已编辑
上海海洋大学 Java
点赞 评论 收藏
分享
电话面四十分钟,问的内容还是比较有深度的,他还会问一些设计上的问题,不过最后面试官跟我说我答得不错,知识掌握的可以,期待自己能进二面吧。自我介绍你在学校里面学过计算机的课程有哪些,操作系统了解吗一个程序是怎么运行的进程什么时候会停止运行IO操作是怎么实现的中断还有没有其他的中断方式介绍一下时间片轮转是怎么实现的(PS:这里引导我了解CPU里面的时序控制,我一开始没理解这块)操作系统的功能是什么如何实现内存管理分页和分段的区别,为什么要分段进程挂起和就绪状态的区别进程通信的方式用户线程和内核线程的区别内核线程由CPU管理,用户线程由谁管理介绍一下JS里面的生成器作用Yeild停止之后JS线程会干什么(PS:这里是让我理解用户线程由程序自己控制)为什么学前端你在实习的时候用的是vue2吗(PS:我说用了组合式api,然后面试官说就想问这个。。。)组合式api解决了什么问题了解http3的新特性吗vue、react和jQuery有什么区别,解决了什么问题组件实现了什么功能前端经历了各种分离,为什么react还会把组件里的HTML、css、js糅合到一起组件间通信有哪些,redux实现了什么redux相比于context有哪些好处用过taiwindcss吗taiwindcss和语义化class有什么区别,哪个更好,给你一个老项目的话呢反问:1、面试官所在组的业务和技术有哪些?答:业务是阿里巴巴主页以及商品列表、登录等业务的制作,技术方面基本使用开源项目2、面试结果什么时候出?答:这是秋招最后一批了,进度会很快
查看26道真题和解析
点赞 评论 收藏
分享
1 3 评论
分享
牛客网
牛客企业服务