力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现

简介: 力扣面试题 08.06. 汉诺塔问题:思路分析+图文详解+代码实现

第一部分:问题描述

1.1 题目

🏠 链接:面试题 08.06. 汉诺塔问题 - 力扣(LeetCode)

⭐ 难度:简单

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:

  1. 每次只能移动一个盘子;
  2. 盘子只能从柱子顶端滑出移到下一根柱子;
  3. 盘子只能叠在比它大的盘子上。

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

1.2 示例

🍀 示例一

输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]

🍀 示例二

输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]

1.3 提示

A中盘子的数目不大于14个。

第二部分:思路分析

假设每根柱子标号 a,b,c,每个圆盘用 1,2,3 … 表示其大小,圆盘初始在 a,要移动到的目标是 c

1️⃣ 移动一个圆盘

如果只有一个圆盘,此时是最小问题,可以直接求解

  • 移动圆盘1 a ↦ c

2️⃣ 移动两个圆盘

如果有两个圆盘,那么

  • 圆盘1 ab
  • 圆盘2 ac
  • 圆盘1 bc

3️⃣ 移动三个圆盘

如果有三个圆盘,那么

  • 圆盘12 ab
  • 圆盘3 ac
  • 圆盘12bc

4️⃣ 移动四个圆盘

如果有四个圆盘,那么

  • 圆盘 123ab
  • 圆盘 4 ac
  • 圆盘 123 bc

因此,如果有n个圆盘,那么

  • 圆盘 1~(n-1) ab
  • 圆盘 n ac
  • 圆盘 1~(n-1) bc

而 n-1 个圆盘如何移动呢,重复父问题的操作即可。

第三部分:代码实现

class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        recursion(A.size(), A, B, C);
    }
    private void recursion(int n, List<Integer> A, List<Integer> B, List<Integer> C) {
        // 先判断需要移动的圆盘数 n 是否为 0
        if (n == 0) {
            return;
        }
        // 将 n-1 个圆盘借助 C 从 A 移动到 B
        recursion(n - 1, A, C, B);
        // 将 第 n 个圆盘从 A 移动到 C
        C.add(A.remove(A.size() - 1));
        // 将 n-1 个圆盘借助 A 从 B 移动到 C
        recursion(n - 1, B, A, C);
    }
}


相关文章
|
5月前
|
人工智能 前端开发 Java
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
139 6
Java 面试资料中相关代码使用方法与组件封装方法解析
|
6月前
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
11月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
532 4
|
JavaScript 前端开发 程序员
JS小白请看!一招让你的面试成功率大大提高——规范代码
JS小白请看!一招让你的面试成功率大大提高——规范代码
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
762 2
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
197 0
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
298 0