zoukankan      html  css  js  c++  java
  • 递归-汉诺塔问题(面试题 08.06. 汉诺塔问题)

    问题描述:

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

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

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

    你需要原地修改栈。

    示例1:

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

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

    解题思路:

    1)先将n-1个放在B柱子上,然后将第n个直接放在C柱子上,最后,将B柱子的放到C柱子上;

    2)终止条件为:当只有一个元素时,直接放置到目标柱子上。

    建议:

    不要刻意思考位置变换细节,直接将其进行分治思考即可。

    Java代码实现流程为:

    class Solution {
        public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
            hanotaProcess(A.size(), A, B, C);
        }
        public void hanotaProcess(int num, List<Integer> original, List<Integer> medium, List<Integer> target){
            if(num == 1){
                target.add(original.remove(original.size() - 1));
                return;
            }
            hanotaProcess(num - 1, original, target, medium);
            target.add(original.remove(original.size() - 1));
            hanotaProcess(num - 1, medium, original,  target);
        }
    }
    java LinkedList的基本知识点:

    offer,add区别:

    一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

    这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。通常用不上。 

     

    poll,remove区别:

    remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,

    但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

     

    peek,element区别:

    element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null
    借鉴博客地址:
    https://blog.csdn.net/qq_36089832/article/details/102011216
  • 相关阅读:
    vue-cli快速搭建
    js严格模式下判断数据类型
    js实现本地的图片压缩上传预览
    web端实现图片放大切换显示预览
    swiper.js在隐藏/显示切换时,轮播出现bug的解决办法
    Zepto.js实现fadeIn,fadeOut功能
    ms
    redis 解决秒杀
    单下滑线 事务 锁
    极验
  • 原文地址:https://www.cnblogs.com/tomorrow-hope/p/13783384.html
Copyright © 2011-2022 走看看