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

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

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

欢迎关注,明天见。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【文件上传与包含漏洞综合利用】DVWA-文件上传-难度:High

实验过程和结果 步骤1&#xff1a;尝试直接上传php木马&#xff0c;失败&#xff0c;截图如下&#xff1a; 步骤2&#xff1a;将php木马后缀改为jpeg尝试上传&#xff0c;依旧失败&#xff0c;截图如下&#xff1a; 步骤3&#xff1a;将真实的jpeg图片1.jpeg上传&#xff0c;成…

云原生Service Mesh服务网格简单介绍

serviceMesh是什么 Service Mesh是一个用于处理服务间通信的基础设施层&#xff0c;旨在实现云原生应用复杂服务拓扑中的可靠请求传递。其基本构成是一组与应用一起部署的轻量级网络代理&#xff0c;这些代理对应用来说是透明的。Service Mesh通过统一的方式来控制和处理服务间…

基于openwrt交叉编译opencv4.9.0版本

源码包的获取 源码获取有两种方式&#xff0c;一种是通过编译时在makefile指定它的git地址&#xff0c;在编译时下载&#xff0c;这种很依赖网速&#xff0c;网速不好时&#xff0c;编译会失败。另一种是我们将源码的压缩包下载到本地&#xff0c;放到我们的SDK中&#xff0c;…

UltraScale+的10G/25G Ethernet Subsystem IP核使用

文章目录 前言一、设计框图1.1、xxv_ethernet_01.2、xxv_ethernet_0_sharedlogic_wrapper1.3、xxv_ethernet_0_clocking_wrapper1.4、xxv_ethernet_0_common_wrapper 二、IP核配置三、仿真四、上板测速五、总结 前言 前面我们学习了很多基于XILINX 7系列的高速接口使用&#x…

CC攻击频发,企业如何做好网络安全,该怎么防护能免遭CC攻击?

在当前网络现状下&#xff0c;随着信息技术的飞速发展&#xff0c;网络攻击手段也愈发多样化和复杂化。其中&#xff0c;CC攻击作为一种针对Web应用层的拒绝服务攻击&#xff0c;其危害日益凸显&#xff0c;对企业和个人造成了严重的威胁。下面我们就从多个角度详细分享关于CC攻…

SpringCloudAlibaba入门学习笔记20240408~20240424

跟学b站“图灵架构师”SpringCloudAlibaba入门教程 系统架构演化进程 单体应用架构>垂直应用架构>分布式架构>SOA架构>微服务架构 1、针对微服务架构&#xff1a; 如何管理众多小服务&#xff1f;(服务治理 注册中心[服务注册 发现 剔除])nacos 众多小服务之间如…

智能驾驶+网络安全

在智能驾驶场景下&#xff0c;安全问题一直是一个持续热点。 针对车机模块不被黑客利用Linux的漏洞攻击&#xff0c;可以采取以下几种方式来提高安全性&#xff1a; 安全设计和防护&#xff1a;在设计车机模块时&#xff0c;需要考虑安全性&#xff0c;并采取相应的安全防护措施…

【Yolov系列】Yolov5学习(一):大致框架

一、Yolov5网络结构 Yolov5特点&#xff1a; 合适于移动端部署&#xff0c;模型小&#xff0c;速度快 Yolov5骨干结构&#xff1a;CSPDarknet53网络Yolov5主要有Yolov5s、Yolov5m、Yolov5l、Yolov5x四个版本。这几个模型的结构基本一样&#xff0c;不同的是depth_multiple模型…

C++ | Leetcode C++题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution { public:int trap(vector<int>& height) {int n height.size();if (n 0) {return 0;}vector<int> leftMax(n);leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] max(leftMax[i - 1], he…

SpringMVC 源码剖析

SpringMVC 源码剖析 0 从源码角度分析SpringMVC执行流程 // 前端控制器&#xff0c;SpringMVC最核心的类 public class DispatcherServlet extends FrameworkServlet {// 前端控制器最核心的方法&#xff0c;这个方法是负责处理请求的&#xff0c;一次请求&#xff0c;调用一次…

数据类型总结

1 引言 在计算机的世界里&#xff0c;数据类型是被人类定义出来的&#xff0c;方便人去更好地理解、辨别数据。计算机只能识别二进制数&#xff0c;不可能要求写代码时&#xff0c;只是输入一些0/1的东西。通过定义数据类型&#xff0c;可以让人和计算机更好地“沟通”&#x…

图像处理|关于二维傅里叶变换的学习笔记(实用版)

因为图像至少是2D的&#xff0c;所以在数字图像处理中使用的都是2D-傅里叶变换。 1.什么是傅里叶变换(DFT)&#xff1f;傅里叶变换是将图像从空间域转换到频域&#xff0c;其逆变换是将图像从频域转到空间域。 物理意义是&#xff1a; 2.频谱图怎么看&#xff1f;傅里叶频谱图…

亚马逊、ozon、美客多等平台的测评技术核心:提升跨境电商业绩的关键要素

现今&#xff0c;越来越多的跨境卖家开始深入了解测评自养号这一领域&#xff0c;他们希望通过优化运营来降低成本并增加利润。在整个测评工作中&#xff0c;测评技术是非常关键的一环。只有不断学习、保持冷静&#xff0c;我们才能不断提升测评能力&#xff0c;从而获得更多机…

Bentley二次开发教程22-文件及模型管理-材质、图层

材质 材质主要用于对元素进行材质贴图&#xff0c;以表现实际的材料样式。材质表中包含材质表&#xff0c;材质面板以及材质。而其属性记录了反射等多种属性以表达实际材质效果。 创建材质 当我们需要创建自定义的材质时&#xff0c;对应的&#xff0c;需要依次创建材质表&…

JavaScript:js实现在线五子棋人机(人人)对弈

在线五子棋人机对弈 全部使用前端技术,使用HTML,CSS以及JS进行实现. 棋盘在后端就是一个15*15的二维数组 页面设计 页面设计的比较粗糙 主要使用js自带的canvas画布进行绘画 HTML代码如下: <div class"outer"><canvas id"canvas" height&qu…

男生一般穿什么裤子好看?五大爆款男装精选测评!

男生裤子要怎么选才能找到适合自己的裤子呢&#xff1f;这肯定是大家选裤子时经常出现的一个疑问了&#xff0c;现在的市面上虽然款式风格非常多&#xff0c;但是由于品牌鱼龙混杂的原因&#xff0c;不同的裤子质量也参差不齐。为了帮助各位男同胞能选到适合自己的裤子&#xf…

centos7使用源码安装方式redis

安装编译源码的工具gcc yum install -y gcc下载源码 源码下载地址 https://download.redis.io/releases/ 注意事项 不建议安装最新版本redis&#xff0c;所以我这里选择6.2.6版本 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压 tar -zxvf redis-…

工业相机和镜头参数和选型

工业相机和镜头参数和选型 文章目录 工业相机和镜头参数和选型前言一、相机参数解释和选型1.相机参数1.1快门-shutter1.2曝光-exposure1.3增益-gain1.4 感光芯片类型&#xff08;CCD/CMOS&#xff09;1.5 感光芯片&#xff08;靶面&#xff09;尺寸1.6 分辨率1.7 像元尺寸1.8 帧…

【点量云流】国内首家适配国产信创的实时云渲染解决方案,助力国产化信创新体验!

一、背景 随着信息技术的广泛应用&#xff0c;信息安全与自主可控成为国家发展的重要保障。近年来&#xff0c;国产化信创的发展&#xff0c;为推动信息技术产业自主创新&#xff0c;实现关键技术和产品的自主可控&#xff0c;对于保障国家信息安全、促进产业发展有着重要意义。…

程序员英语之Spring篇

spring.io/quickstart 本期课程讲解Spring官网的快速上手页面 官网地址 https://spring.io/quickstart Spring Quickstart Guide Spring 快速开始指南 Guide 指南 What you’ll build 接下来你将要构建的是什么&#xff1f; build 构建 You will build a classic “H…