【春招笔试】2025.04.26饿了么春招笔试改编题

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

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

🌸 目前本专栏已经上线60+套真题改编解析,后续会持续更新的

春秋招合集 -> 互联网必备刷题宝典🔗

饿了么

题目一:字符阴阳转换器

1️⃣:维护转换器的阴阳状态,初始为阴状态

2️⃣:根据当前状态和字符类型应用不同的转换规则

3️⃣:遍历字符串,模拟状态变化和字符转换过程

难度:简单

这道题目考察对字符串处理和状态模拟的基本理解。通过按题目规则模拟阴阳转换器的工作过程,使用O(n)的时间复杂度即可解决。关键是理解状态转换的条件和字符转换的规则。

题目二:迷宫探险路径计数

1️⃣:使用深度优先搜索(DFS)枚举所有可能路径

2️⃣:利用回溯算法记录已访问位置,避免重复访问

3️⃣:对四种移动方式依次尝试,统计到达终点的路径数

难度:中等

这道题目要求计算从起点到终点的不同路径数量,是一个经典的图论搜索问题。通过DFS或回溯法可以枚举所有可能的路径。关键在于维护已访问的位置集合,确保每个位置最多访问一次,同时处理好边界条件。

题目三:魔法网格变换计数

1️⃣:理解交换操作可以生成所有保持0/1数量不变的排列

2️⃣:分析网格权值奇偶性与度奇点数量的关系

3️⃣:用组合数学计算满足条件的网格数量

难度:困难

这道题目结合了网格分析和组合数学,需要深入理解网格权值计算和交换操作的本质。通过分析,问题可以转化为计算从特定位置选择偶数个点放1的方案数。使用预处理和组合数公式,可以实现O(N+M/2)的高效解法。

01. 字符阴阳转换器

问题描述

小柯最近发明了一种奇特的字符阴阳转换器,这个转换器可以在阴阳两种状态之间切换,并且能够改变字符的大小写。初始状态下,转换器处于"阴"状态。

转换器的工作原理如下:

  • 当转换器处于"阴"状态且遇到小写字母时,它会将该字母转换为大写,并且转换器状态切换为"阳";
  • 当转换器处于"阳"状态且遇到大写字母时,它会将该字母转换为小写,并且转换器状态切换为"阴";
  • 其他情况下,字符保持不变,转换器状态也不变。

小柯有一个长度为 的字符串,她想知道按照从左到右的顺序使用转换器处理这个字符串后,最终的字符串会是什么样子。

输入格式

第一行输入一个正整数 (),表示字符串的长度。

第二行输入一个长度为 的字符串 ,仅由大小写英文字母组成。

输出格式

输出一个字符串,表示经过转换器处理后的字符串。

样例输入

5
abCCd

样例输出

AbcCD

数据范围

  • 字符串 仅由大小写英文字母组成
样例 解释说明
样例1 下标1:状态为"阴",字符为'a'(小写),转换为'A'(大写),状态切换为"阳";
下标2:状态为"阳",字符为'b'(小写),不满足转换条件,保持不变,状态仍为"阳";
下标3:状态为"阳",字符为'C'(大写),转换为'c'(小写),状态切换为"阴";
下标4:状态为"阴",字符为'C'(大写),不满足转换条件,保持不变,状态仍为"阴";
下标5:状态为"阴",字符为'd'(小写),转换为'D'(大写),状态切换为"阳"。

题解

这道题目的核心是理解并模拟字符阴阳转换器的工作原理。

首先,我们需要维护一个表示转换器当前状态的变量,初始为"阴"状态。然后从左到右遍历字符串中的每个字符,根据转换规则进行处理:

  1. 如果状态为"阴"且当前字符是小写字母,将其转换为大写,同时将状态切换为"阳"
  2. 如果状态为"阳"且当前字符是大写字母,将其转换为小写,同时将状态切换为"阴"
  3. 对于不满足上述条件的字符,不做任何改变,状态也保持不变

这是一个典型的模拟题,我们只需要按照题目描述的规则从左到右处理字符串即可。由于只需遍历一次字符串,时间复杂度为 ,空间复杂度为 (不考虑存储输入输出的空间)。

在实现中,我们可以使用C++的islowerisupper函数来判断字符的大小写,使用touppertolower函数来进行大小写转换。对于Python,我们可以使用字符串的islower()isupper()upper()lower()方法来实现相同的功能。

这个问题没有特别的技巧或优化,关键是理解题目描述并正确实现模拟过程。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
n = int(input())
s = input()

# 处理字符串
yin = True  # 初始状态为"阴"
res = []

# 遍历字符串,根据规则转换字符
for c in s:
    if yin and c.islower():  # "阴"状态遇到小写字母
        res.append(c.upper())
        yin = False
    elif not yin and c.isupper():  # "阳"状态遇到大写字母
        res.append(c.lower())
        yin = True
    else:  # 其他情况保持不变
        res.append(c)

# 输出结果
print("".join(res))
  • Cpp
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    string s;
    cin >> n >> s;
    
    // 初始状态为"阴"
    bool is_yin = true;
    
    // 遍历字符串进行转换
    for (char &c : s) {
        if (is_yin && islower(c)) {
            // "阴"状态遇到小写字母
            c = toupper(c);
            is_yin = false;
        } else if (!is_yin && isupper(c)) {
            // "阳"状态遇到大写字母
            c = tolower(c);
            is_yin = true;
        }
        // 其他情况保持不变
    }
    
    cout << s << "\n";
    return 0;
}
  • Java
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String s = br.readLine();
        
        // 初始状态为"阴"
        boolean isYin = true;
        StringBuilder result = new StringBuilder();
        
        // 遍历字符串进行转换
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (isYin && Character.isLowerCase(c)) {
                // "阴"状态遇到小写字母
                result.append(Character.toUpperCase(c));
                isYin = false;
            } else if (!isYin && Character.isUpperCase(c)) {
                // "阳"状态遇到大写字母
                result.append(Character.toLowerCase(c));
                isYin = true;
            } else {
                // 其他情况保持不变
                result.append(c);
            }
        }
        
        System.out.println(result.toString());
    }
}

02. 迷宫探险路径计数

问题描述

小毛是一名探险家,他面前有一条长度为 的直线迷宫,迷宫上有编号从 个点。小毛初始站在坐标 处,他的目标是到达坐标 处的出口。

在迷宫中移动时,小毛每次可以选择以下四种移动方式之一:

  • 向左移动 格(坐标
  • 向左移动 格(坐标
  • 向右移动 格(坐标
  • 向右移动 格(坐标

由于迷宫的魔法规则,小毛每个位置最多只能访问一次(起点视为已访问过),并且移动后的坐标必须保持在 范围内。一旦到达出口 ,小毛就会立即停止移动。

小毛想知道,总共有多少种不同的移动方案能让他成功到达出口?

输入格式

一行输入三个整数 (; ; ),分别表示迷宫的长度、小毛的初始位置和出口位置。

输出格式

输出一个整数,表示有多少种不同的移动方案能够使小毛成功到达出口。

样例输入

3 2 3

样例输出

3

数据范围

样例 解释说明
样例1 在这个样例中,有以下三种移动方案:
- 方案1:(直接向右移动1格)
- 方案2:(先向左移动1格到1,再向右移动2格到3)
- 方案3:(先向左移动2格到0,再向右移动1格到1,最后向右移动2格到3)

题解

这道题目要求计算从起点到终点的不同路径数量,同时满足一些特殊的移动规则。由于每个位置最多只能访问一次,且移动选择有限,这是一个经典的图搜索问题。

考虑到题目的约束条件:

  1. 每个位置最多访问一次
  2. 每次可以向左或向右移动1或2格
  3. 坐标必须在[0,n]范围内
  4. 一旦到达终点就停止移动

这样的问题可以使用深度优先搜索(DFS)来解决,我们用回溯法枚举所有可能的路径。

具体算法步骤如下:

  1. 使用一个布尔数组visited来标记已访问的位置,初始时将起点x标记为已访问
  2. 从起点x开始进行DFS搜索
  3. 在DFS函数中,如果当前位置等于终点y,则找到一条有效路径,计数器加1
  4. 否则,尝试四种可能的移动(左移1格、左移2格、右移1格、右移2格)
  5. 对于每种移动,检查新位置是否在有效范围内且未被访问过,如果满足条件,则将新位置标记为已访问,并递归调用DFS
  6. 回溯时,将当前位置标记为未访问,以便尝试其他路径

这个算法的时间复杂度与可行路径的数量成正比。在最坏情况下,可能需要枚举所有可能的简单路径,但由于n的范围较小(最大为25),算法是可以在合理时间内运行的。空间复杂度为O(n),主要用于存储访问记录和递归调用栈。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
n, x, y = map(int, input().split())

# 初始化访问数组
vis = [False] * (n + 1)
vis[x] = True  # 标记起点为已访问

# 移动方向
dirs = [-2, -1, 1, 2]

# 计数器
cnt = 0

# DFS函数
def dfs(pos):
    global cnt
    
    # 到达终点
    if pos == y:
        cnt += 1
        return
    
    # 尝试四种移动方式
    for d in dirs:
        nxt = pos + d
        # 检查新位置是否有效
        if 0 <= nxt <= n and not vis[nxt]:
            vis[nxt] = True  # 标记为已访问
            dfs(nxt)  # 递归搜索
            v

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

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务