虾皮笔试 虾皮笔试题 0402
笔试时间:2025年04月02日
历史笔试传送门:
第一题
题目:分割等和数组
给定一个只包含正整数的非空数组 nums,判断该数组是否可以被分割成两个子集,使得两个子集的元素和相等。
样例输入
[1,5,11,5]
样例输出
true
参考题解
*******************************************************************************
第二题
题目:二叉树遍历
给你一个全部节点是正整数的二叉树,逐层的从左到右访问所有节点,输出为一个二维数组;注:# 代表该节点没有值
样例输入
{5,20,11,#,7}
样例输出
[[5],[20,11],[7]]
参考题解
二叉树的层序遍历,直接bfs即可。
第三题
题目:艾尔罗大迷宫
设计一个迷宫游戏系列艾尔罗,在设计初期为了方便,使用n*n矩阵表示.0代表可到达区域,1表示不可到达区域.例如有:[[0, 1, 0, 0][0, 0, 0, 0][0, 1, 0, 1][0, 0, 1, 0]]在这个例子中,因为map[3] [2] = 1和map[2] [3] =1.所以相对于起点map[0] [0]来说,map[3] [3]的位置是不可达的(只允许左右上下移动).为了方便评估设计的艾尔罗迷宫的难易程度,需要有一个方便的算法统计每个迷宫不可到达的网格有多少个.比如上面的不可达区域为4个原生不达的区域加上1个衍生的map[3] [3].总数为5.约束:起点统一定义为[0,0].给定的迷宫二维数组矩阵形式是n*n,且[0,0]也总是可达(值为0),原生不可达的用值1表示。
样例输入
[[0,1,1,0],[1,0,0,0],[0,1,0,1],[0,1,1,0]]
样例输出
15
说明:[0,0]被困,所以都不可达。
参考题解
统计原生障碍数量:遍历二维矩阵,统计所有值为1的元素数量。广度优先搜索(BFS)标记可达区域:从起点[0,0]出发,使用BFS遍历所有可达的0区域,并标记已访问的位置。计算不可达的0区域:遍历整个矩阵,统计所有未被访问且值为0的元素数量。总不可达数:原生障碍数 + 不可达的0区域数。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
int apply(vector<vector<int>>& generated_map) {
int n = generated_map.size();
vector<vector<bool>> visited(n, vector<bool>(n, false));
queue<pair<int, int>> q;
q.push({0, 0});
visited[0][0] = true;
// 定义四个方向
vector<pair<int, int>> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (auto [dx, dy] : directions) {
int nx = x + dx;
int ny = y + dy;
if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
if (!visited[nx][ny] && generated_map[nx][ny] == 0) {
visited[nx][ny] = true;
q.push({nx, ny});
}
}
}
}
// 统计障碍物数量
int count_ones = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
if (generated_ma
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南