小红书笔试 小红书笔试题 0908
笔试时间:2024年09月08日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目:机器人
小红书的冒险家们!今天,我们要进入一个充满挑战的高科技迷言。这是一张由小红书科技部最新研发的网格地图,每个格子都营着秘密一它们内置了自动滑行带!这些滑行带会让所有进入它们的机器人自动翻一个特定方向滑行。网格地图每个格子都藏着秘密一它们内置了自动滑行带!这些滑行带会让所有进入它们的机器人自动朝一个特定方向滑行。具体来说,一张n*m的网格地图,左上角为(1,1),右下角为(n,m),每个格子有一个滑行带,前进方向为L,R,U,D,分别表示左右上下四个方向前进。
- 如果第t时刻,机器人位于(i,j),(i,j)滑行带前进方向为L,则第t+1时刻机器人位于(i,j-1),
- 如果第t时刻,机器人位于(i,j),(i,j)滑行带前进方向为R,则第t+1时刻机器人位于(i,j+1)
- 如果第t时刻,机器人位于(i,j),(i,j)小滑行带前进方向为U,则第t+1时刻机器人位于(i-1,j)
- 如果第t时刻,机器人位于(i,j),(i,j)小滑行带前进方向为D,则第t+1时刻机器人位于(i+1,j)。
机器人走出地图后就会毁坏,一个格子可以容纳多个机器人。第0时刻,每个位置都有一个机器人,问:第10^8时刻,地图上还剩下多少个机器人?
输入描述
第一行两个整数nm(1≤nm≤510^3),表示地图大小。
接下来n行,每行一个包含m个字符的字符串,表示每个格子滑行带的方向。
输出描述
输出一行一个整数,表示第10^8时刻,地图上剩下机器人的数量。
样例输入
2 5
LRRLR
UULLR
样例输出
6
参考题解
dfs。读取网格地图中每个格子的滑行带方向 (L, R, U, D),然后使用深度优先搜索 (DFS) 追踪每个格子的运动轨迹,记录它是否会滑出地图边界或进入一个循环。具体来说,对每个格子,DFS 会判断机器人是否会进入循环状态或者滑出边界,通过一个二维数组 vis标记每个格子的状态:0表示未访问,1表示已访问且在地图内,-1表示滑出了地图边界。最后,统计所有标记为 1的格子数,这些格子的机器人在第10^8时刻仍然在地图上。这样,我们能够有效地计算出剩余的机器人数量。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h>
using namespace std;
vector<vector<char>> mp;
vector<vector<int>> vis;
int n, m;
pair<int, int> move(int x, int y) {
if (mp[x][y] == 'U') {
return { x - 1,y };
}
if (mp[x][y] == 'D') {
return { x + 1,y };
}
if (mp[x][y] == 'L') {
return { x,y - 1 };
}
if (mp[x][y] == 'R') {
return { x,y + 1 };
}
return { x,y };
}
int dfs(int x, int y) {
if (vis[x][y]) {
return vis[x][y];
}
vis[x][y] = 1;
pair<int, int> next = move(x, y);
if (next.first < 0 || next.first >= n || next.second < 0 || next.second >= m) {
return vis[x][y] = -1;
}
return vis[x][y] = dfs(next.first, next.second);
}
int main() {
cin >> n >> m;
mp.resize(n, vector<char>(m));
vis.resize(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mp[i][j];
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dfs(i, j) == 1) {
ans++;
}
}
}
cout << ans << endl;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Main {
static char[][] mp;
static int[][] vis;
static int n, m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
mp = new char[n][m];
vis = new int[n][m];
for (int i = 0; i < n; i++) {
String line = sc.next();
for (int j = 0; j < m; j++) {
mp[i][j] = line.charAt(j);
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dfs(i, j) == 1) {
ans++;
}
}
}
System.out.println(ans);
sc.close();
}
public static int dfs(int x, int y) {
if (vis[x][y] != 0) {
return vis[x][y];
}
vis[x][y] = 1;
int[] next = move(x, y);
if (next[0] < 0 || next[0] >= n || next[1] < 0 || next[1] >= m) {
return vis[x][y] = -1;
}
return vis[x][y] = dfs(next[0], next[1]);
}
public static int[] move(int x, int y) {
if (mp[x][y] == 'U') {
return new int[]{x - 1, y};
}
if (mp[x][y] == 'D') {
return new int[]{x + 1, y};
}
if (mp[x][y] == 'L') {
return new int[]{x, y - 1};
}
if (mp[x][y] == 'R') {
return new int[]{x, y + 1};
}
return new int[]{x, y};
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
def move(x, y):
if mp[x][y] == 'U':
return x - 1, y
if mp[x][y] == 'D':
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
查看7道真题和解析
