• 算法练习(13)-打印纸条对折的折痕类型(凹痕?凸痕?)


    从左神视频上看到一个有趣的题目,据说是微软的算法面试题:一个长纸条,对折后再展开,中间会有一个凹痕,然后同样的方式,再继续对折, 又会多出2条折痕(不过新折痕会有凸有凹),如此反复对折,纸条上就会留下一系列的折痕,见下图:

    要求:输入1个数字(n),表示对折的次数, 从上而下, 打印每1条拆痕的类型(即:凹痕?凸痕?)

    思路:咋一看, 好象无从下手, 但是参考上图中的标记,尝试几次后,把这些痕迹画成一颗二叉树,纸条从上到向的痕迹类型,正好是中序遍历!不得不感叹这题出得巧妙

    找到规律后,就好办了,不过题目只要求打印节点值,并不需要根正建立一颗二叉树,而且观察上图, 可以发现每个节点的左子节点,全是“凹”,右子节点全是“凸”, 所以代码可以精减些:

        /**
         * 打印折痕
         * @param level 当前层序号(根节点层序为1)
         * @param maxLevel 总层数(即:对折次数)
         * @param bulge 本层痕迹是否为“凸”痕
         */
        static void printFolder(int level, int maxLevel, boolean bulge) {
            if (level > maxLevel) {
                return;
            }
            //分析发现,左侧全是凹痕
            printFolder(level + 1, maxLevel, false);
            //递归序第2次打印时机,正好对应中序遍历
            System.out.printf(level + "" + (bulge ? "凸	" : "凹	"));
            //分析发现,右侧全是凸痕
            printFolder(level + 1, maxLevel, true);
        }
    

    调用时(假设对折3次):

    printFolder(1, 3, false);

    输出:

    3凹 2凹 3凸 1凹 3凹 2凸 3凸

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Eclipse下配置javaweb项目快速部署到tomcat
    SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)
    # 浏览器兼容性 小结
    # HTML && CSS 学习笔记
    # li鼠标移入移出,点击,变背景色,变checkbox选中状态
    SpringMVC开发入门讲义
    Spring同mybatis整合讲义(事物)
    Spring中的AOP开发
    Spring框架IOC,DI概念理解
    Mybatis里SQL语句的分页
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/15489121.html
Copyright © 2020-2023  润新知