字节跳动(社招)三面算法原题

TikTok 喘息

继上月通过强制剥离 TikTok 法案后,美国众议院在当地时间 20 日下午以 360 票赞成 58 票反对通过了新的法案:剥离 TikTok 的期限由生效后 165 天调整至 270 天之内,即今年 11 月的美国总统大选后。

之前我们讲过,TikTok 比较好的破局方式,只能是期望当时躲过特朗普狙击的方法能再奏效一次,发动用户把动静搞大,尽量拖延法案通过的日期,目的是将禁令实施拖到大选之后。

目前看来,这一步现在已经达到,但这不意味 TikTok 走出困局。

在这个窗口期中,TikTok 一方面能做的是稳住根基。自从上月颁布禁令之后,不少中大企业开始逐步将业务搬离 TikTok,这显然会让美国公司利益和 TikTok 存亡进行松绑,TikTok 应当尽最大的努力留着这些公司;另一方面是继续维护好舆论场中的受害方形象,确保禁令话题的在美热度,持续发动用户对国会制造麻烦,目前除了 TikTok 用户,以及一众网红公开力挺 TikTok 以外,连 X(前推特)的老板马斯克也表示 TikTok 不该被禁,禁令有悖于言论和表达自由。

当然,也要做好最坏的打算,即「退出美国」的准备。

卖是不可能卖的,这背后原因远不是公司所属权这么简单。

...

回归主线。

来一道和「字节跳动」相关的算法原题。

题目描述

平台:LeetCode

题号:1210

你还记得那条风靡全球的贪吃蛇吗?

我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格。蛇会从左上角((0, 0) 和 (0, 1))开始移动。我们用 0 表示空单元格,用 1 表示障碍物。

蛇需要移动到迷宫的右下角((n-1, n-2) 和 (n-1, n-1))。

每次移动,蛇可以这样走:

  • 如果没有障碍,则向右移动一个单元格。并仍然保持身体的水平/竖直状态。
  • 如果没有障碍,则向下移动一个单元格。并仍然保持身体的水平/竖直状态。
  • 如果它处于水平状态并且其下面的两个单元都是空的,就顺时针旋转 90 度。蛇从( (r, c)(r, c+1))移动到 ( (r, c)(r+1, c))。 alt
  • 如果它处于竖直状态并且其右面的两个单元都是空的,就逆时针旋转 90 度。蛇从( (r, c)(r+1, c))移动到( (r, c)(r, c+1))。 alt

返回蛇抵达目的地所需的最少移动次数。

如果无法到达目的地,请返回 -1

示例 1: alt

输入:grid = [[0,0,0,0,0,1],
               [1,1,0,0,1,0],
               [0,0,0,0,1,1],
               [0,0,1,0,1,0],
               [0,1,1,0,0,0],
               [0,1,1,0,0,0]]

输出:11

解释:
一种可能的解决方案是 [右, 右, 顺时针旋转, 右, 下, 下, 下, 下, 逆时针旋转, 右, 下]。

示例 2:

输入:grid = [[0,0,1,1,1,1],
               [0,0,0,0,1,1],
               [1,1,0,0,0,1],
               [1,1,1,0,0,1],
               [1,1,1,0,0,1],
               [1,1,1,0,0,0]]

输出:9

提示:

  • 蛇保证从空单元格开始出发。

BFS

题目要我们求从特定起点到特定终点的最少步数,由于我们蛇的长度固定为 ,因此我们可用三元组 来代表蛇的实际位置。其中 代表蛇尾位置, 代表当前蛇的方向状态, 代表水平状态, 代表竖直状态。

蛇尾加上方向状态可确定其蛇头位置 :tx = cd == 0 ? nx : nx + 1ty = cd == 0 ? ny + 1 : ny

对四种移动规则所导致三元组变化进行分情况讨论:

  1. 往右移动:对于蛇尾而言,只有维度 进行加一,其余维度不变。三元组变化总结为
  2. 往下移动:对于蛇尾而言,只有维度 进行加一,其余维度不变。三元组变化总结为
  3. 旋转:对于蛇尾,只有 维度对进行翻转,其余维度不变。三元组变化总结定为

综上,所有移动规则可总结为 int[][] dirs = new int[][]{{1,0,0},{0,1,0},{0,0,1}}

在进行 BFS 时,通过遍历 dirs 来得到新的三元组:原位置 (x, y, cd) 转换到新位置 (x + dir[0], y + dir[1], cd ^ dir[2])

在得到新蛇尾位置 之后,计算新蛇头的位置 。需要确保整条蛇没有越界,没有碰到障碍物,并且旋转转移时,额外检查 位置是否合法。

Java 代码:

class Solution {
    int[][] dirs = new int[][]{{1,0,0},{0,1,0},{0,0,1}};
    public int minimumMoves(int[][] g) {
        int n = g.length;
        Deque<int[]> d = new ArrayDeque<>();
        d.addLast(new int[]{0,0,0,0});
        boolean[][][] vis = new boolean[n][n][2];
        vis[0][0][0] = true;
        while (!d.isEmpty()) {
            int[] info = d.pollFirst();
            int x = info[0], y = info[1], cd = info[2], step = info[3];
            for (int[] dir : dirs) {
                int nx = x + dir[0], ny = y + dir[1], nd = cd ^ dir[2]; // 新蛇尾位置和方向
                int tx = nd == 0 ? nx : nx + 1, ty = nd == 0 ? ny + 1 : ny; // 新蛇头
                if (nx >= n || ny >= n || tx >= n || ty >= n) continue// 整条蛇不越界
                if (g[nx][ny] == 1 || g[tx][ty] == 1continue// 没有触及障碍物
                if (vis[nx][ny][nd]) continue;
                if (cd != nd && g[x + 1][y + 1] == 1continue// 旋转时,额外检查多一个位置
                if (nx == n - 1 && ny == n - 2 && nd == 0return step + 1;
                d.addLast(new int[]{nx, ny, nd, step + 1});
                vis[nx][ny][nd] = true;
            }
        }
        return -1;
    }
}

C++ 代码:

class Solution {
public:
    int minimumMoves(vector<vector<int>>& g) {
        vector<vector<int>> dirs = {{1,0,0}, {0,1,0}, {0,0,1}};
        int n = g.size();
        queue<vector<int>> d;
        d.push({0000});
        vector<vector<vector<bool>>> vis(n, vector<vector<bool>>(n, vector<bool>(2false)));
        vis[0][0][0] = true;
        while (!d.empty()) {
            vector<int> info = d.front();
            d.pop();
            int x = info[0], y = info[1], cd = info[2], step = info[3];
            for (vector<int>& dir : dirs) {
                int nx = x + dir[0], ny = y + dir[1], nd = cd ^ dir[2]; 
                int tx = nd == 0 ? nx : nx + 1, ty = nd == 0 ? ny + 1 : ny; 
                if (nx >= n || ny >= n || tx >= n || ty >= n) continue;
                if (g[nx][ny] == 1 || g[tx][ty] == 1continue;   
                if (vis[nx][ny][nd]) continue;
                if (cd != nd && g[x + 1][y + 1] == 1continue
                if (nx == n - 1 && ny == n - 2 && nd == 0return step + 1;
                d.push({nx, ny, nd, step + 1});
                vis[nx][ny][nd] = true;
            }
        }
        return -1;
    }
};

Python 代码:

class Solution:
    def minimumMoves(self, g: List[List[int]]) -> int:
        dirs = [(100), (010), (001)]
        n = len(g)
        d = deque([(0,0,0,0)])
        vis = [[[0]*2 for _ in range(n)] for _ in range(n)]
        vis[0][0][0] = 1
        while d:
            x, y, cd, step = d.popleft()
            for dir in dirs:
                nx, ny, nd = x + dir[0], y + dir[1], cd ^ dir[2]
                tx, ty = nx + (nd == 1), ny + (nd == 0)
                if nx >= n or ny >= n or tx >= n or ty >= n: continue
                if g[nx][ny] == 1 or g[tx][ty] == 1continue
                if vis[nx][ny][nd]: continue
                if cd != nd and g[x + 1][y + 1] == 1continue
                if nx == n - 1 and ny == n - 2 and nd == 0return step + 1
                d.append((nx, ny, nd, step + 1))
                vis[nx][ny][nd] = 1
        return -1

TypeScript 代码:

function minimumMoves(g: number[][]): number {
    const n = g.length;
    const d: [numbernumbernumbernumber][] = [[0,0,0,0]];
    const vis: boolean[][][] = Array.from({ length: n }, () => Array.from({ length: n }, () => [falsefalse]));
    vis[0][0][0] = true;
    const dirs: [numbernumbernumber][] = [[1,0,0], [0,1,0], [0,0,1]];
    while (d.length > 0) {
        const [x, y, cd, step] = d.shift()!;
        for (const dir of dirs) {
            const nx = x + dir[0], ny = y + dir[1], nd = cd ^ dir[2];
            const tx = nd === 0 ? nx : nx + 1, ty = nd === 0 ? ny + 1 : ny;
            if (nx >= n || ny >= n || tx >= n || ty >= n) continue;
            if (g[nx][ny] === 1 || g[tx][ty] === 1continue
            if (vis[nx][ny][nd]) continue;
            if (cd !== nd && g[x + 1][y + 1] === 1continue;
            if (nx === n - 1 && ny === n - 2 && nd === 0return step + 1;
            d.push([nx, ny, nd, step + 1]);
            vis[nx][ny][nd] = true;
        }
    }
    return -1;
};
  • 时间复杂度:
  • 空间复杂度: ,其中 代表蛇可变状态方向

最后

给大伙通知一下 📢 :

全网最低价 LeetCode 会员目前仍可用!!!

📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!

🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!

🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!

专属链接:leetcode.cn/premium/?promoChannel=acoier

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981483.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

中国新能源汽车快速发展 充电模块市场前景广阔

中国新能源汽车快速发展 充电模块市场前景广阔 充电模块是一种用于充电的电子模块&#xff0c;指可以直接焊装在印刷电路板上的、以模块方式体现的电源供应器&#xff0c;主要由电源管理电路、充电控制电路和充电保护电路等部分组成。充电模块在充电系统中不仅负责提供能源电力…

学python的第二十天

多线程 以下内容来源于《看漫画学Python》这本书&#xff0c;前面十几天好多内容参考过本书内容&#xff0c;写的挺好。 1 线程相关知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立的一块内存空间&#xff0c;一组系统资源。在进程概念中&…

3月魅力彩妆行业数据分析:某国产品牌彩妆产品销额将近30亿!

彩妆行业发展多年&#xff0c;经历了多重红利期和激烈的市场竞争后&#xff0c;进入到缓慢发展时期。 根据鲸参谋数据显示&#xff0c;今年3月在线上电商平台&#xff08;淘宝天猫京东&#xff09;彩妆产品销量累计超过6700万件&#xff0c;同比去年下降了29%&#xff1b;销售…

小程序视频如何下载到手机#下载高手

在本文中&#xff0c;我将向您介绍一个工具:下载高手&#xff0c;帮助您轻松下载小程序视频&#xff0c;并将其保存到您的手机中。无论是学习教育类的小程序视频&#xff0c;还是图片素材类的小程序&#xff0c;这些方法都适用于各种类型的小程序。 工具我已经打包好了&#x…

Vue集成three.js,加载glb、gltf类型的3d模型

安装基本依赖 // 注意OrbitControls要加{}&#xff0c;注意路径是jsm import { OrbitControls } from ‘three/examples/jsm/controls/OrbitControls.js’; // import { dat } from ‘three/examples/jsm/controls/dat.gui.js’; // dat gui这个插件&#xff0c;是另外自己下载…

计算机网络---第十一天

生成树协议 stp作用&#xff1a; 作用&#xff1a;stp用于解决二层环路问题。 BPDU&#xff1a; 含义&#xff1a;桥协议数据单元&#xff0c;用于传递stp协议相关报文 分类&#xff1a;配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

【性能测试】ChaosTesting(混沌测试)ChaosBlade(混沌实验工具)(四)-k8s容器混沌实验

5. 创建 kubernetes 相关的实验场景 5.0 blade create k8s 5.0.1 介绍 创建 kubernetes 相关的实验场景&#xff0c;除了使用 blade 命令创建场景外&#xff0c;还可以将实验使用 yaml 文件描述&#xff0c;使用 kubectl 命令执行。目前支持的实验场景如下&#xff1a; [bl…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件…

重磅!Llama-3,最强开源大模型正式发布!

4月19日&#xff0c;全球科技、社交巨头Meta在官网&#xff0c;正式发布了开源大模型——Llama-3。 据悉&#xff0c;Llama-3共有80亿、700亿两种参数&#xff0c;分为基础预训练和指令微调两种模型&#xff08;还有一个超4000亿参数正在训练中&#xff09;。 与Llama-2相比&…

如何阻止cPanel与WHM自动重定向到服务器主机名

本周有一个客户&#xff0c;购买Hostease的VPS主机&#xff0c;询问我们的在线客服&#xff0c;如何阻止cPanel / WHM自动重定向到服务器主机名。我们为用户提供教程&#xff0c;用户很快完成了设置。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对您有帮助。 接…

Python自学篇2-导入Win32库

Python导入win32模块 导入win32模块可以让我们在Python中使用Windows的API功能&#xff0c;这对于开发需要与Windows操作系统进行交互的应用程序非常有用。 本文将介绍如何导入win32模块&#xff0c;并提供一些代码示例来帮助读者更好地理解。 什么是win32模块&#xff1f; …

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.3-13.5

目录 第 8 周 13、 聚类(Clustering)13.3 优化目标13.4 随机初始化13.5 选择聚类数 第 8 周 13、 聚类(Clustering) 13.3 优化目标 K-均值最小化问题&#xff0c;是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和&#xff0c;因此 K-均值的代价函数&#xff08;又…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

PS入门|用PS设计物品尺寸,需要注意的几个重要问题

注&#xff1a;仅学习使用 【PS24】2024版本更新的内容比较多&#xff0c;对电脑配置的要求也是比较高的。建议配置&#xff1a;第十代i5或以上CPU。 如果是第十代i3或以下的CPU&#xff0c;建议安装PS2021或者以下版本。 ---这是一条不正经的分割线--- 讲了那么久的PS教程…

Matlab 对nc文件进行处理

1.介绍nc文件 NetCDF全称为network Common Data Format&#xff0c;中文译法为“网络通用数据格式”&#xff1b;netcdf文件开始的目的是用于存储气象科学中的数据&#xff0c;现在已经成为许多数据采集软件的生成文件的格式。 •从数学上来说&#xff0c;netcdf存储的数据就是…

springboot停机关闭前保证处理完请求

application.yml配置 server:shutdown: graceful // 处理完请求在关闭服务server:shutdown: immediate // 立刻关闭&#xff0c;默认 jvm关闭自带的回调

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

Python基础学习之去除换行符

strip() 方法 strip() 方法用于去除字符串开头和结尾的空白字符&#xff0c;包括换行符&#xff08;\n&#xff09;、制表符&#xff08;\t&#xff09;和空格等。如果您想从字符串数据中去掉换行符&#xff0c;无论是单独存在的还是与其他空白字符一起&#xff0c;strip() 方…

【LAMMPS学习】八、基础知识(4.3)TIP3P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…