当前位置: 首页 > news >正文

字母板上的路径 题解,力扣官方出来挨打(小声)

  1. 字母板上的路径
    我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。
    在这里插入图片描述
    在本题里,字母板为board = [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。
    我们可以按下面的指令规则行动:
    如果方格存在,‘U’ 意味着将我们的位置上移一行;
    如果方格存在,‘D’ 意味着将我们的位置下移一行;
    如果方格存在,‘L’ 意味着将我们的位置左移一列;
    如果方格存在,‘R’ 意味着将我们的位置右移一列;
    ‘!’ 会把在我们当前位置 (r, c) 的字符 board[r][c] 添加到答案中。
    (注意,字母板上只存在有字母的位置。)
    返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。

这道题在拿到的时候第一眼我想的是把所有字母到另一字母的路径全部通过遍历出来,然后存在一张map里,在通过Map拿,然后拼到答案里,但是这样的开销有些大,因为要做图搜索,且要遍历26*25次,所以图搜索的思路先放弃,绝对不是图搜索学得不好不会写什么的(世上无难事,只要肯放弃)_(:з」∠)_

那么就换个思路,开始找规律吧(早干啥了啊喂)。(╬ ̄皿 ̄)=○#( ̄#)3 ̄)

我们可以发现上面的图就是一个二维数组。以ai为例,a的坐标是[0,0],i的坐标是[1,4],alphabetBoardPath(“i”)=“URRRR!”
也就是说纵向移动,或者说是U和D在答案中的数量取决于ax-ix,横向移动,或者说是U和D在答案中的数量取决于ay-iy。
将a在26个英文字母中的顺序视为0,字母在图表中的x = 他在26个英文字母中的顺序/5(向下取整),y = 他在26个英文字母中的顺序%5。例如z,在字母中的顺序为25,x=25/5=5,y=25%5=0,z的坐标为[5,0]。(心机之蛙一直摸你肚子)
我们将规律转化一下可得一下代码:

    public String alphabetBoardPath(String target) {StringBuilder result = new StringBuilder();target = "a" + target;for (int i = 0; i < target.length() - 1; i++) {result.append(returnOperation((Integer) (target.charAt(i) - 'a'), (Integer) (target.charAt(i + 1) - 'a')));}return result.toString();}String returnOperation(int strat, int end) {StringBuilder result = new StringBuilder();int lateralMovement = strat % 5 - end % 5;int longitudinalMovement = strat / 5 - end / 5;for (int i = 0; i < Math.abs(longitudinalMovement); i++) {result.append(longitudinalMovement < 0 ? "D" : "U");}for (int i = 0; i < Math.abs(lateralMovement); i++) {result.append(lateralMovement < 0 ? "R" : "L");}result.append("!");return result.toString();}

然鹅,力扣竟然报错了:
在这里插入图片描述
输出:
“DDDDD!UUUUURRR!DDDDDLLL!”
预期结果:
“DDDDD!UUUUURRR!DDDDLLLD!”
我实在是百思不得其解,无论如何都看不出来我为啥错了。(¬‸¬) ?
于是去看了力扣官方给的答案:

    public String alphabetBoardPath(String target) {int cx = 0, cy = 0;StringBuilder res = new StringBuilder();for (int i = 0; i < target.length(); i++) {char c = target.charAt(i);int nx = (c - 'a') / 5;int ny = (c - 'a') % 5;if (nx < cx) {for (int j = 0; j < cx - nx; j++) {res.append('U');}}if (ny < cy) {for (int j = 0; j < cy - ny; j++) {res.append('L');}} if (nx > cx) {for (int j = 0; j < nx - cx; j++) {res.append('D');}}if (ny > cy) {for (int j = 0; j < ny - cy; j++) {res.append('R');}}  res.append('!');cx = nx;cy = ny;}return res.toString();}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/alphabet-board-path/solution/zi-mu-ban-shang-de-lu-jing-by-leetcode-s-c30t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(╯’ - ‘)╯︵ ┻━┻
我猜了一下应该是因为路径的顺序,先赌他一手,按照ULDR的顺序返回。先把桌子摆好┬─┬ ノ(’-'ノ)
改出了以下代码:

    public String alphabetBoardPath(String target) {StringBuilder result = new StringBuilder();target = "a" + target;for (int i = 0; i < target.length() - 1; i++) {result.append(returnOperation((Integer) (target.charAt(i) - 'a'), (Integer) (target.charAt(i + 1) - 'a')));}return result.toString();}String returnOperation(int strat, int end) {StringBuilder result = new StringBuilder();int lateralMovement = strat % 5 - end % 5;int longitudinalMovement = strat / 5 - end / 5;for (int i = 0; i < longitudinalMovement; i++) {result.append("U");}for (int i = 0; i < lateralMovement; i++) {result.append("L");}for (int i = 0; i > longitudinalMovement; i--) {result.append("D");}for (int i = 0; i > lateralMovement; i--) {result.append("R");}result.append("!");return result.toString();}

不愧是你啊力扣,题目里说好的 你可以返回任何达成目标的路径。 呢。最后还是要按顺序返回。(╯°Д°)╯︵ ┻━┻

就酱,大家如果有更好的思路请务必和我讨论,下班下班★,°:.☆( ̄▽ ̄)/$:.°★

http://www.lryc.cn/news/4372.html

相关文章:

  • 代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串
  • vueday01-脚手架安装详细
  • 初识cesium3d(一)
  • 点云转3D网格【Python】
  • 【OpenCV图像处理系列一】OpenCV开发环境的安装与搭建(Ubuntu + Window都适用)
  • 【代码随想录】-动态规划专题
  • c++数据类型 输入输出
  • 【设计模式-11】责任链模式
  • SpringBoot+Vue实现智能物流管理系统
  • 【MT7628】MT7628如何修改串口波特率、调试串口物理口、使用UART3口
  • css盒模型介绍
  • onetab 谷歌插件历史数据清除
  • GRBL源码简单分析
  • 第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(谓语动词的情态)
  • 软考高级考试中有五大证书,其中哪个更值得考?
  • FlexRay™ 协议控制器 (E-Ray)-04
  • container_of 根据成员变量获得包含其的对象的地址!
  • Linux进程概念
  • 算法设计与分析
  • C++ 基础
  • [golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务
  • 数据仓库层Repository(CrudRepository、PagingAndSortingRepository、JpaRepository)
  • 大数据技术架构(组件)33——Spark:Spark SQL--Join Type
  • Linux: bash起后台进程引发的僵尸进程
  • 网络安全攻防中,Rock-ON自动化的多功能网络侦查工具,Burpsuite被动扫描流量转发
  • 电子技术——共模抑制
  • 对KMP简单的理解
  • Hibernate不是过时了么?SpringDataJpa又是什么?和Mybatis有什么区别?
  • 数学建模拓展内容:卡方检验和Fisher精确性检验(附有SPSS使用步骤)
  • 【Python学习笔记之七大数据类型】