首页 > 其他分享 >leet code 752. 打开转盘锁

leet code 752. 打开转盘锁

时间:2023-12-13 21:04:28浏览次数:27  
标签:752 leet code 10 int contains computeRet queue repeat

752. 打开转盘锁

题目描述

你有一个带有四个圆形拨轮的转盘锁。
每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'

每个拨轮可以自由旋转:例如把 '9' 变为 '0','0' 变为 '9' 每次旋转都只能旋转一个拨轮的一位数字。
锁的初始数字为 '0000' ,一个代表四个拨轮的数字的字符串。
列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。
字符串 target 代表可以解锁的数字,你需要给出解锁需要的最小旋转次数,如果无论如何不能解锁,返回 -1 。

示例 1:

输入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"

输出:6

解释: 可能的移动序列为 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。

注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 这样的序列是不能解锁的,
因为当拨动到 "0102" 时这个锁就会被锁定。

示例 2:

输入: deadends = ["8888"], target = "0009"

输出:1

解释:把最后一位反向旋转一次即可 "0000" -> "0009"

示例 3:

输入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888" 输出:-1

解释:无法旋转到目标数字且不被锁定。

提示:
1 <= deadends.length <= 500
deadends[i].length == 4
target.length == 4
target 不在 deadends 之中
target 和 deadends[i] 仅由若干位数字组成

题目解析

由题意可知:拨轮可以自由旋转。即 0 -> 9; 9 -> 0;

  • 那么 0 -> 1 也是一种可能,所以有:对于数字0,可以变为 9 或者 1

  • 锁的初始数字是 0000
  • 那么拨动一次之后有可能有 8 种结果
  • 即:
  • 1000;9000
  • 0100;0900
  • 0010;0090
  • 0001;0009
  • 8 种可能的结果再次拨动,就是 64 种结果
  • 直到 找到可以解锁的数字 target
  • 考虑到 转动到死亡数字,锁会被锁死,那么当遇到死亡数字的时候直接跳过当前这一种可能的结果

  • 其中怎么模拟 转盘锁 转动是需要好好考虑的

show code

class Solution {
    public int openLock(String[] deadends, String target) {
        // 初始化数字为  0000
        if("0000".equals(target)) {
            return 0;
        }

        int targetNum = 0;
        for (int i = 0; i < target.length(); i++) {
            // 把解锁字符串,转成数字.
            targetNum = targetNum * 10 + (target.charAt(i) - '0');
        }

        // 把死锁所代表的数字 转存起来
        Set<Integer> deadNum = new HashSet<>();
        for (String deadend : deadends) {
            int num = 0;
            for(int i = 0;i < deadend.length();i++) {
                num = num * 10 + (deadend.charAt(i) - '0');
            }
            deadNum.add(num);
        }
        if(deadNum.contains(0)) {
            return -1;
        }

        // 我需要一个集合来保存出现过的数字,这里不用 string 因为会导致频繁创建对象
        Set<Integer> repeat = new HashSet<>();

        repeat.add(0);


        // 每一次转动产生的结果用一个 队列保存起来
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(0);

        // 锁转动次数
        int ans = 0;

        while(!queue.isEmpty()) {
            int sz = queue.size();

            while (sz > 0) {
                // 取出一个数字
                Integer poll = queue.poll();
                // 找到了解锁数字,直接返回
                if(poll.equals(targetNum)) {
                    return ans;
                }
                // 开始转动 转盘锁
                // 定义四个数字,分别代表 转盘锁的四个位置
                int a = 0,b = 0,c = 0,d = 0;
                d = poll % 10;
                poll /= 10;
                c = poll % 10;
                poll /= 10;
                b = poll % 10;
                poll /= 10;
                a = poll % 10;

                // 可以出现 8 种组合

                // a 转动
                int aUp = ((a + 1) == 10?0:(a + 1)) * 1000;
                int computeRet = aUp + b * 100 + c * 10 + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }
                int aLow = ((a - 1) == -1?9:(a - 1)) * 1000;
                computeRet = aLow + b * 100 + c * 10 + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }

                // b 转动
                int bUp = ((b + 1) == 10?0:(b + 1)) * 100;
                computeRet = a * 1000 + bUp + c * 10 + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }
                int bLow = ((b - 1) == -1?9:(b - 1)) * 100;
                computeRet = a * 1000 + bLow + c * 10 + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }

                // c 转动
                int cUp = ((c + 1) == 10?0:(c + 1)) * 10;
                computeRet = a * 1000 + b * 100 + cUp + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }
                int cLow = ((c - 1) == -1?9:(c - 1)) * 10;
                computeRet = a * 1000 + b * 100 + cLow + d;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }

                // d 转动
                int dUp = (d + 1) == 10?0:(d + 1);
                computeRet = a * 1000 + b * 100 + c * 10 + dUp;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }
                int dLow = (d - 1) == -1?9:(d - 1);
                computeRet = a * 1000 + b * 100 + c * 10 + dLow;
                if(!deadNum.contains(computeRet) && !repeat.contains(computeRet)) {
                    repeat.add(computeRet);
                    queue.offer(computeRet);
                }
                sz--;
            }
            ans++;
        }

        return -1;
    }
}

标签:752,leet,code,10,int,contains,computeRet,queue,repeat
From: https://blog.51cto.com/u_16079703/8806036

相关文章

  • ICEE-Microchip-MPLAB® X IDE-Microchip-MPLAB-MCC(MPLAB® Code Configurator)
    MCC(MPLAB®CodeConfigurator)https://www.microchip.com/en-us/tools-resources/configure/mplab-code-configurator#downloadsMPLAB®CodeConfigurator(MCC)isafreeGPE(graphicalprogrammingenvironment):generatesCcode(seamless,easy-to-understand)to......
  • 代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素
     Leetcode704:二分查找今日学习的文章链接:代码随想录(programmercarl.com) 题目链接:704.二分查找-力扣(LeetCode)●  自己看到题目的第一想法这题我会,但是还没明白卡尔说的循环不变量是什么意思。我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值......
  • vs code调试appium-adb项目记录
    一、前言因为使用appium的时候发现一个问题,最后定位在是appium-adb执行的时候processExists函数时出现的问题。因此需要对appium-adb进行断点调试以及修改。appium-adb项目是使用javascript和Typescript写的,所以也就是对js项目的调试。因为第一次接触js,很多东西一步步摸索过来的......
  • VSCode 中使用 AI智能编程工具的几个小妙招
    可能你已经在IDE中安装了CodeGeeX,也了解到CodeGeeX能够帮助你编写代码、调试问题、创建文档,生成单元测试等。但是总有些“Wow!”时刻,还在等你发现。今天就介绍几个CodeGeeX插件在VSCode中的使用技巧和小窍门。一、侧边栏放右边,效率倍增默认情况下,CodeGeeX插件在VSCode中成功安装......
  • Codeforces Round 812 (Div. 2)
    基本情况第一次赛时做出div2的ABC。然而B题是秒的最快的?A题卡了一段时间经典+4,C题代码实现卡了一段时间。A.TravelingSalesmanProblemProblem-A-Codeforces卡题分析主要原因在少了特判,没有自己多构造几个特殊情况数据。这是一开始的代码voidsolve(){ intn,......
  • Codeforces Round 810 (Div. 2)
    基本情况A题秒了,B、C题死活看不懂题目。B.PartyProblem-B-Codeforces错误分析为啥看不懂题目,一方面是英语水平确实不够,另一方面就是图的意识不行,如果能看出来这题隐含的建图思想,就很有助于理解题目。正确思路题意有\(T\)组数据,每组数据给你一组\(n,m\)表示共......
  • 通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)
    目录1.概述2.NodePort方式3.Ingress方式4.救命稻草5.其他1.概述今天聊点啥呢,话说,你有没有想过怎样用VSCode连上K8s集群内的某个Pod,然后直接更新Pod内的代码?当我听到这个需求的时候,第一反应是在Pod内搞一个sshd,然后NodePort方式暴露Pod,接着用VSCode的......
  • [Codeforces] CF1737C Ela and Crickets
    CF1737CElaandCrickets题意给定一个\(n\timesn\)的棋盘,棋盘上有且仅有三颗排成\(\text{L}\)形的棋子。对于\(\text{L}\)形的定义,有且仅有以下四种情况:棋子的移动规则和跳棋相同。它可以水平、垂直或斜向移动。当且仅当一个棋子的某个方向紧随另一个棋子时,它能跳......
  • CodeIgniter3.chm 打包编译 需要 hhc.exe - php框架
    电子书地址https://github.com/CodeIgniter-Chinese/rapid-php-application-development我打包编译好了chm,https://files.cnblogs.com/files/pengchenggang/CodeIgniter3.chm.zip?t=1702438484&download=truehhc.exe下载组件HTMLHelpWorkshophhc.exe下载地址:https://ww......
  • Python报错:pkg-config could not find libraries ['avformat', 'avcodec', 'av
    参考:https://github.com/PyAV-Org/PyAV/issues/238https://pyav.org/docs/6.1.2/installation.html#mac-os-x  =====================  报错信息:C:\Users\liuxue>pipinstallavCollectingavUsingcachedav-0.3.3.tar.gzInstallingcollectedpackages:avRunning......