【春招笔试】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'(大写),状态切换为"阳"。 |
题解
这道题目的核心是理解并模拟字符阴阳转换器的工作原理。
首先,我们需要维护一个表示转换器当前状态的变量,初始为"阴"状态。然后从左到右遍历字符串中的每个字符,根据转换规则进行处理:
- 如果状态为"阴"且当前字符是小写字母,将其转换为大写,同时将状态切换为"阳"
- 如果状态为"阳"且当前字符是大写字母,将其转换为小写,同时将状态切换为"阴"
- 对于不满足上述条件的字符,不做任何改变,状态也保持不变
这是一个典型的模拟题,我们只需要按照题目描述的规则从左到右处理字符串即可。由于只需遍历一次字符串,时间复杂度为 ,空间复杂度为
(不考虑存储输入输出的空间)。
在实现中,我们可以使用C++的islower
和isupper
函数来判断字符的大小写,使用toupper
和tolower
函数来进行大小写转换。对于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: - 方案2: - 方案3: |
题解
这道题目要求计算从起点到终点的不同路径数量,同时满足一些特殊的移动规则。由于每个位置最多只能访问一次,且移动选择有限,这是一个经典的图搜索问题。
考虑到题目的约束条件:
- 每个位置最多访问一次
- 每次可以向左或向右移动1或2格
- 坐标必须在[0,n]范围内
- 一旦到达终点就停止移动
这样的问题可以使用深度优先搜索(DFS)来解决,我们用回溯法枚举所有可能的路径。
具体算法步骤如下:
- 使用一个布尔数组
visited
来标记已访问的位置,初始时将起点x标记为已访问 - 从起点x开始进行DFS搜索
- 在DFS函数中,如果当前位置等于终点y,则找到一条有效路径,计数器加1
- 否则,尝试四种可能的移动(左移1格、左移2格、右移1格、右移2格)
- 对于每种移动,检查新位置是否在有效范围内且未被访问过,如果满足条件,则将新位置标记为已访问,并递归调用DFS
- 回溯时,将当前位置标记为未访问,以便尝试其他路径
这个算法的时间复杂度与可行路径的数量成正比。在最坏情况下,可能需要枚举所有可能的简单路径,但由于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%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力