虾皮笔试 虾皮笔试题 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等多种语言做法集合指南