精华内容
下载资源
问答
  • Word 高效办公,三步搞定活动策划排版(快人半小时) 业务需求 & 效果实现   了解业务需求前先随便展示一些常见的问题,看看这些坑你平时有没有踩到 你知道怎么双面打印吗 双面打印时...

    在这里插入图片描述

    引言

      本篇博文结合这两篇食用更佳(知识点遥相呼应,有共通之处,且大多结合使用,轻松举一反三)

    Word 注重页面细节才专业(添加页眉页脚,调整页边距,消灭孤行) | 职场人就应该这样用 Word

    Word 高效办公,三步搞定活动策划书排版(快人半小时)

    业务需求 & 效果实现

      了解业务需求前先随便展示一些常见的问题,看看这些坑你平时有没有踩到

    • 你知道怎么双面打印吗
    • 双面打印时,你知道怎么让页眉页码的位置不同吗?对称分布,奇偶页不同?
    • 自己排版好的内容,去别的电脑打印格式错乱,知道怎么解决吗?
    • 你知道怎么缩放打印,一页打印出多页的效果,更好的实现开卷考试的小抄效果和为装订线留出空白吗?

    本篇将会解决

    人人都必须掌握的打印相关基本设置

    • 双面打印
    • 正反面不同
    • 缩放打印
    • 格式转换

    双面打印

    普通文档进行双面打印,非常简单,如下图即可在这里插入图片描述

    正反面不同

      ok,那么问题来了,怎么让页面侧边留出足够装订位置,让内容的正面和反面都偏向开口的另一边呢?这个小小的职场细节若不注意,很有可能突然拌你一脚,让你吃个大亏
    在这里插入图片描述
      很可惜,博文开头超链接里面讲到的标尺调节与页边距调节都不管用了
    在这里插入图片描述
      在页面布局中,有一个神奇的功能,可以实现这个效果!它就是…奇偶页不同!

      先来看看平平无奇的处理前,我通过鼠标滚轮将其缩放成两页,这样方便查看奇偶页效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
      终于完美的呈现在对称的两边了。如果你是要打印书籍的话,则建议在中央两侧留空
    在这里插入图片描述
      Word文档也一样,双面打印时,怎样让页码始终在装订线的另一边?也同样还是奇偶页不同
    在这里插入图片描述
      因为设置了奇偶页不同,所以可以单独为奇数页设计页眉而不会影响偶数页的设计。技巧:对页眉页脚分别设置个左右对齐即可。
    在这里插入图片描述

    缩放打印

    在这里插入图片描述
      但打印出来的结果我们没办法在打印预览上看到,所以可以将打印机调成 pdf 后另存为试试看效果
      如果发现似乎打不开 pdf,只需要下载一个福昕阅读器就可以啦!这里留个迷省略了效果图,打印出来效果杠杠的

      记得在批量打印前先打印一两页试试效果!


    后记

      Word 与 Excel 的技巧看似琐碎,但积累到一定程度后,便可以发现许多技巧都存在共通之处,小事情重复做也会成为大麻烦,但高手都懂得分类处理。
      Office 的使用跟写程序中用到的循环一样,贯通了 3 个核心,我们才能省时省事,成为别人眼中的高手。

    • 大量重复的工作懂得批处理
    • 反复要做的固定操作固化成 " 模板 “,” 套路 "
    • 碰到异常情况,知道准确高效的解决。

      数据分析,商业实践,数据可视化,网络爬虫,统计学,Excel,Word, 社会心理学,认知心理学,行为科学,民族意志学 各种专栏后续疯狂补充

      欢迎评论与私信交流!

    展开全文
  • 别再了,面试二叉树看这 11 个就够了~

    万次阅读 多人点赞 2019-09-13 10:16:16
    如果一棵二叉树和它的镜像一样,那么它是对称的。 面试题28:[ 题目解析 ] 1.6 从上到下打印二叉树 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。(按层遍历二叉树) 面试...

    写在前边

    数据结构与算法:

    不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github。欢迎关注和 star: 「数据结构与算法仓库

    PS:如果你刚刚在学习数据结构和算法,请务必把最简单的题弄懂,所有的入门的数据结构与算法从简单到复杂进行了全面的梳理。
    初学者必会的 30 道数据结构与算法

    如果你对数据结构和算法有了一定的了解和认识,上边的入门算法题已经可以轻松实现,那么可以尝试着解决 LeetCode 上总结的 30 道题,我把解题思路、测试用例、代码实现做了详细的整理,建议先自己尝试的解决哦,收藏 + 关注,欢迎 Star。「必会的 30 道 LeetCode 经典算法题

    如果你正在面试,经典的《剑指offer》所有的面试代码实现 (JavaScript 版)放在 Github 仓库,可自行查看。Github 地址「剑指 offer 所有题目 JavaScript 版解题思路、总结、代码测试。✍️✍️✍️

    网络协议原理:

    除了算法之外,面试最注重的就是网络原理,因为我本身上的学校很烂,课上只是讲点皮毛,当时也没重视这一块,所以在大三面试的时候吃了大亏,然后开始重视了起来,这部分虽然理论上偏多,但是从最基础的开始学习需要有个引导,上来就是 TCP 和 HTTP,想必学起来很吃力吧。然后我尝试着去根源上学习网络原理,为什么会有这些,所以边学习,边整理成了文章分享给学习网络原理这一块的内容,每周 Github 都会更新~ 「猛戳这里查看仓库


    — 一下是正文 ----

    《剑指 offer》是准备数据结构与算法面试的一本好书,里边很多面试手写算法很多的注意的问题,但是基本都是用 C++ 实现的,书中每章节的分类都是按照性能和消耗以及手写代码的注意的几大点进行了分类,针对每个不同的点,进行数据结构与算法的混合实现。

    二遍刷题,发现了还可以根据自身情况进行整理和分类。全部代码是用 JS 书写,都经过 Leetcode 标准测试(小部分Leetcode 没有的题目),对所有的算法题的特点进行总结分类,手写算法中,如何考虑到全部的边界条件;如果快速多种思路解决,如何将思路快速的转化为代码,这是这一篇重点分享的地方。

    二叉树题目共有 11 题,我把这 11 题书中对实现方法和思路有详细的讲解,但是对于个人来说,以后遇到陌生的二叉树的题目怎么进行解决,通过对 11 个题的分析、整理,得出以下几个步骤,首先先来看这 11 个二叉树经典算法题。

    PS:如果你已经做过这几道题,而且能够顺利的手写出来,不妨滑到最底部,希望最后的二叉树思路、测试用例以及代码编写的总结对你在面试中有所帮助(这篇文章精华所在)。


    11 道精华二叉树面试题

    1.1 面试题7:重建二叉树

    已知前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4,7,2,1,5,3,8,6},它的二叉树是怎么样的?

    1、思路

    根据前、中序遍历的特点,(根左右、左根右),先根据前序遍历确定根节点,然后在中序遍历知道该根节点的左右树的数量,反推出前序遍历中左子树的结点有哪些。根据该思路进行递归即可完成二叉树的重建。

    2、 测试用例

    • 完全二叉树、非完全二叉树 —— 普通测试。
    • 只有左子节点二叉树,只有右子节点、只有一个结点的二叉树 —— 特殊二叉树测试。
    • 空树、前序和中序不匹配 —— 输入测试。

    3、代码实现

     1 // 定义结点
     2 // class TreeNode{
     3 //     constructor(data){
     4 //         this.data = data;
     5 //         this.left = null;
     6 //         this.right = null;
     7 //     } 
     8 // }
     9
    10 // 参数:前序遍历数组 ~ 中序遍历数组
    11 const reConstructBinaryTree = (pre, vin)=>{
    12    // 判断前序数组和中序数组是否为空
    13    if(!pre || pre.length === 0 || !vin || vin.length === 0){
    14        return;
    15    }
    16    // 新建二叉树的根节点
    17    var treeNode = {
    18        val: pre[0]
    19    }
    20    // 查找中序遍历中的根节点
    21    for(var i = 0; i < pre.length; i++) {
    22        if (vin[i] === pre[0]) {
    23            // 将左子树的前中序遍历分割开
    24            treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
    25            // 将右子树的前中序遍历分割开
    26            treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
    27        }
    28    }
    29    // 返回该根节点
    30    return treeNode;
    31 }
    32
    33 let pre = [1,2,4,7,3,5,6,8]; // 前序遍历
    34 let vin = [4,7,2,1,5,3,8,6]; // 中序遍历 
    35 console.log(reConstructBinaryTree(pre,vin));
    

    1.2 二叉树的下一节点

    给定一个二叉树的节点,如何找出中序遍历的下一节点。有两个指向左右子树的指针,还有一个指向父节点的指针。

    面试题8:[题目解析]


    1.3 树的子结构

    输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。

    面试题26:[题目解析]


    1.4 二叉树的镜像

    请完成一个函数,如果一个二叉树,该函数输出它的镜像。

    面试题27:[题目解析]


    1.5 对称二叉树

    请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

    面试题28:[题目解析]


    1.6 从上到下打印二叉树

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。(按层遍历二叉树)

    面试题32:[题目解析]


    1.7 二叉树的后序遍历序列

    输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历。如果是返回 true,如果不是返回 false。假设输入的任意两个数字互不相同。

    面试题33:[题目解析]


    1.8 二叉树和为某一值路径

    输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输出整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。

    面试34:[题目解析]


    1.9 序列化二叉树

    请实现两个函数,分别用来序列化二叉树和反序列化二叉树。

    面试题37:[题目解析]


    1.10 二叉树的第 K 大节点

    给定一棵二叉搜索树,请找出其中的第 K 大节点。

    面试题54:[题目解析]


    1.11 二叉树的深度

    输入一棵二叉树的根节点,求该树的深度。从根节点到叶子节点依次经过的节点(包含根、叶子节点)形成树的一条路径,最长路径的长度树的深度。

    面试题55:[题目解析]


    总结归纳

    通过《剑指 offer》以上十一个题,不是做过之后就记住了这么简单,而是通过以上二叉树题型的总结归纳,能不能举一反三,总结出二叉树面试题的解题思路,以后遇到二叉树相面试题能不能通过上边总结出来的步骤进行思考独立解决,这是这篇文章的重点。下面就分别通过解题思路、测试用例以及编写代码进行深入总结。

    一、解题思路总结

    1、根据树前(根左右)、中(左根右)、后(左右根)序遍历的规律来解决问题。

    通过二叉树的遍历来找到规律,从而找到解题思路。

    • 重建二叉树

      根据前、中序遍历,找到二叉树的根节点和左右子树的规律,然后递归构建二叉树。

    • 二叉树的下一节点

      根据中序遍历,找出包含任何节点的一下节点的所有可能情况,然后根据情况分别进行判断。

    • 二叉树的后续遍历序列

      通过中序遍历找到打印二叉树结点的规律,可以判断此后续遍历是否为二叉树。

    • 二叉树和为某一值的路径

      选择二叉树的遍历,对每个节点进行存储判断,然后根据二叉树叶子节点的特点,进行对问题的解决。

    • 二叉树的第 K 大结点

      中序遍历的结果是从小到大,然后倒数找到第 K 大数据。

    • 序列化二叉树

      遍历二叉树,遇到 null 转化为特殊符号。


    2、根据树的结构寻找规律来解决问题

    通过二叉树的特点:左子节点小于父节点、右子节点大于父节点、树的节点可以进行递归等,以上特点又是更好的帮我们解决思路。

    • 树的子结构

      根据子结构和主体树的特点,对其树的结构进行分析,可以找到解题的思路。

    • 镜像二叉树

      观察镜像二叉树的左右子节点交换特点,可以找到解题思路。

    • 对称二叉树

      观察对称二叉树有什么特点,在结构上和遍历上寻找特点和规律,可以找到解题思路。

    • 按层遍历二叉树

      根据二叉树每层节点的结构关系(父子关系),可以进行每层遍历,通过上层找到下层的遍历结点。

    • 反序列化二叉树

      根据遍历的规律和二叉树的规律,将遍历结果生成一棵二叉树。


    二、测试用例

    通过以上题目中,我将测试用例分为三大种,测试代码的时候,在这三大种进行想就可以了。

    • 普通测试
    • 特殊测试
    • 输入测试

    1、普通测试

    普通测试从两个方面去想,第一个方面就是问题的本身,比如对称二叉树的判断,普通测试就是分别输入一个对称二叉树和非对称二叉树进行测试。第二个方面就是问题本身没有什么可以找到的测试,比如按层遍历二叉树,它的普通测试就是分别输入完全二叉树(普通二叉树也可以),非完全二叉树进行测试。


    2、特殊测试

    特殊测试强调的是树的特殊性,特殊的二叉树就那么几个,比如:只有左子节点的二叉树、只有右子节点的二叉树、只有一个节点的二叉树、没有结点的二叉树。


    3、输入测试

    输入测试,顾名思义,要对用户输入的参数进行判断,比如,你输入一棵树,要判断是否为空。再比如,求最大 K 结点,对 K 的取值范围进行判断。


    三、代码编写

    将二叉树的解题思路转化为代码除了熟练最基本的二叉树的增、删、改、查之外,最重要的就是二叉树的递归,因为二叉树的结构决定了用递归解决二叉树问题更加简便。但是递归的书写并不仅简单,因为它有递和归的过程,大脑并不能更好的去处理这些,可以去看之前总结递归的文章《数据结构与算法之递归系列》。

    书写二叉树递归问题有一点特别重要,不要尝试的去想那个递归的过程,而是先去寻找到递归的终止条件,然后对每次递归的结果进行判断,然后让他递归去吧,再次强调千万别去思考过程。

    后记

    刷了一遍剑指 offer 没有领略到这些题的精华所在,然后开始刷第二遍、第三遍、第四遍… 逐渐的对同一类型的题做出总结,第一周完成了所有二叉树面试题的总结,下一周会选择下一类型面试题进行攻克,打算用两个月的时间,将剑指 offer 所有的面试题型进行体系化的总结、归纳,边学习、边分享。「猛戳剑指 offer 仓库,和我一起打卡


    下一篇:动画:面试如何轻松手写链表?


    推荐阅读:

    1、动画:用动画给面试官解释 TCP 三次握手过程

    2、动画:用动画给女朋友讲解 TCP 四次分手过程


    福利:可以在我的公众号『小鹿动画学编程』,后台回复『资源』即可获取。

    在这里插入图片描述
    在这里插入图片描述

    ❤️ 不要忘记留下你学习的脚印 [点赞 + 收藏 + 评论]

    文章都看完了,为何不妨点个赞呢?嘻嘻,那就说明你很自私,你怕那么好的文章让别人也看到。开个小小玩笑。

    其实我也很自私,我把我的一直以来坚持原创的公众号:「小鹿动画学编程」偷偷给你,里边汇聚了小鹿以动画形式讲解的数据结构与算法、网络原理、Web 等技术文章。
    在这里插入图片描述

    动一动你的小手,点赞就完事了,每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=


    作者Info:

    【作者】:小鹿

    【原创公众号】:小鹿动画学编程。

    【简介】:和小鹿同学一起用动画的方式从零基础学编程,将 Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。先定个小目标,原创 1000 篇的动画技术文章,和各位小伙伴共同努力一起学习!公众号回复 “资料” 送一从零自学资料大礼包!

    【转载说明】:转载请说明出处,谢谢合作!~

    展开全文
  • 编程之美读书笔记:烙饼的问题

    千次阅读 2013-12-04 21:57:46
    问题的描述:一摞大小无序的饼,允许单个或者多个一起直接的颠倒,求最优化的饼过程。 刚看到题目的时候,感觉比较的简单,就想一个数组,加上for循环,再加上几个条件判断就好了。只是一个程序,丝毫没有算法什么...

    问题的描述:一摞大小无序的饼,允许单个或者多个一起直接的颠倒,求最优化的翻饼过程。

    刚看到题目的时候,感觉比较的简单,就想一个数组,加上for循环,再加上几个条件判断就好了。只是一个程序,丝毫没有算法什么的概念,或者说就是为了解题而解题。看了书上面的分析,有点看不大懂的感觉,细细的看,才觉得这个才是问题沉淀的一个过程,或者说这样才是积累的一个过程。就比如高中老师说的那样:会一道题,算什么,要根据一道题会一片。

    首先是,分析的一个过程,一般来说对于问题的,穷举都能有一定的帮助,对于问题的理解和发现其中的规律。现在是我们想到是首先找到最大的数,把它翻转到最下面。然后顺着这个思路进行分析。


    粗略的搜索最优的解决的方案,是首把所有的可能的翻转方案过一篇,记录者最小的,利用的是递归的实现,递归的结束条件,一个是翻转的次是必须小于分析的最大值,一个是一个完成了。


    java代码实现:

    public class CakeTurn {
    
    	public int m_nCakeCnt ;//烙饼的个数
    	public int[] m_cakeArray ;//烙饼的半径的数组
    	public int m_nMaxSwap;//最大的反转的次数
    	public int[] m_swapArray;//交换的结果的数组
    	public int[] m_reverseCakeArray;//当前翻转烙饼信息数组
    	public int[] m_reverseCakeArraySwap;//当前翻转烙饼交换结果数组
    	int m_nSearch;//当前搜索次数信息
    	
    	public void run(int[] cakeArray,int cakeNumber){
    		//初始化数组
    		init(cakeArray,cakeNumber);
    		m_nSearch = 0;
    		search(0);
    	}
    
    	public void output(){
    		for (int i = 0; i < m_nMaxSwap; i++) {
    			System.out.print("  "+m_swapArray[i]);
    		}
    		
    		System.out.println(" searchTimes: " + m_nSearch); 
    		System.out.println(" Total swap times : " + m_nMaxSwap);
    	}
    	//搜索
    	private void search(int step) {
    		//首先是搜索的步骤,每一步的搜索都记录,用于后面的计算
    		 int i, nEstimate;
    	        m_nSearch++;
    	        
    	        //剪枝条件,估计这个剪枝的判断,是相邻的数字不计入翻转的次数的,
    	        nEstimate = lowerBound(m_reverseCakeArray);
    	        if( step + nEstimate > m_nMaxSwap || step >= m_nMaxSwap)
    	            return;
    	        //是否翻转完成
    	        if( isSorted( m_reverseCakeArray)){
    	            if( step < m_nMaxSwap){//取翻转的次数
    	                m_nMaxSwap = step;
    	                for(i = 0; i < m_nMaxSwap; i++)
    	                    m_swapArray[i] = m_reverseCakeArraySwap[i];//记录翻转的结果
    	            }
    	            return;
    	        }
    	        
    	        for(i = 1; i < m_nCakeCnt; i++){
    	            revert(0,i);
    	            System.out.println(Arrays.toString(m_reverseCakeArray));//打印翻转过程中的,过程的变化
    	            m_reverseCakeArraySwap[step] = i;
    	            search(step+1);
    	            revert(0,i);//并不是一开始找到了能够翻转好的方法,就完了,而是要确定最小的翻转的次数。
    	        }
    	        
    	    }
    
    	private void revert(int begine, int end) {
    		int i = 0,j=0,t=0;
    		//翻转烙饼的信息
    		for (i = begine,j= end ; i < j; i++,j--) {
    			t = m_reverseCakeArray[i];
    			m_reverseCakeArray[i] = m_reverseCakeArray[j];
    			m_reverseCakeArray[j] = t;
    		}
    		
    	}
    
    	//判断是否已经排好了续
    	private boolean isSorted(int[] reverseCakeArray) {
    		for (int i = 1; i < reverseCakeArray.length; i++) {
    			if(reverseCakeArray[i-1] > reverseCakeArray[i]){
    				return false;
    			}
    		}
    		return true;
    	}
    
    	//估计这次搜索所需要的最小的交换的次数
    	private int lowerBound(int[] cakeArray) {
    		int t,ret = 0;
    		//根据当前数组的排列顺序来判断最少需要交换多少次
    		for(int i=1;i<cakeArray.length;i++){
    			t = cakeArray[i]- cakeArray[i-1];
    			if(t==-1||t==1){
    				
    			}else{
    				ret++;
    			}
    		}
    		return ret;
    	}
    
    	//初始化烙饼的信息:半径的信息组和烙饼的数量
    	public void init(int[] cakeArray2, int cakeNumber2) {
    		m_nCakeCnt = cakeNumber2;
    		m_cakeArray = new int[m_nCakeCnt];
    		for(int i = 0 ; i< cakeArray2.length;i++){
    			m_cakeArray[i] = cakeArray2[i];
    		}
    		
    		//最大的次数的获得
    		m_nMaxSwap = upperBound(m_nCakeCnt);
    		
    		//设置初始化交换结果的数组
    		m_swapArray = new int[m_nMaxSwap];
    		
    		//初始化中间交换结果的信息
    		m_reverseCakeArray = new int[m_nCakeCnt];
    		for (int i = 0; i < m_nCakeCnt; i++) {
    			m_reverseCakeArray[i] = m_cakeArray[i];
    		}
    		m_reverseCakeArraySwap = new int[m_nMaxSwap];
    		
    	}
    
    	//寻找当前翻转的最大值
    	private int upperBound(int cakeNumber2) {
    		return cakeNumber2*2;
    	}
    	
    	public static void main(String[] args){
    		CakeTurn problem = new CakeTurn();
    //		int[] cakeArray = {3,2,1,6,5,4,9,8,7,0};
    //		int[] cakeArray = {3,2,1,6,5,4};
    		int[] cakeArray = {3,2,1};
            problem.run(cakeArray,cakeArray.length);
            problem.output();
    	}
    }
    看到这个逻辑的实现,还是感觉比较的舒服的。最重要的是理解,这段代码:

     for(i = 1; i < m_nCakeCnt; i++){
    	            //任何的时候都是从第一个到第几个开始翻转,所以首先得是从1到length-1来遍历,表现在程序中,就是i
    	            revert(0,i);
    	            System.out.println(Arrays.toString(m_reverseCakeArray));//打印翻转过程中的,过程的变化
    	            //记录每一步,我从一到第几块饼(i)的翻转,也就是翻转的过程的记录
    	            m_reverseCakeArraySwap[step] = i;
    	            //既然第一步是从一开始便利,那么相同的第二步的逻辑还是和第一步一样的,从上面数几块饼进行翻转。
    	            //没有退出条件的话,会一直的循环下去。所以我们在search中有自己的推出的条件,剪枝和是否完成
    	            search(step+1);
    	            revert(0,i);//并不是一开始找到了能够翻转好的方法,就完了,而是要确定最小的翻转的次数。
    	        }

    最简单的{3,2,1} 结果打印出来是,打印的是翻转过程中烙饼信息的变化:

    [2, 3, 1]
    [3, 2, 1]
    [2, 3, 1]
    [3, 2, 1]
    [2, 3, 1]
    [3, 2, 1]
    [1, 3, 2]
    [1, 2, 3]
    [1, 3, 2]
    [3, 1, 2]
    [2, 3, 1]
    [1, 2, 3]
    [1, 3, 2]
    [3, 1, 2]
    [2, 3, 1]
    [1, 2, 3]
      2 searchTimes: 17
     Total swap times : 1

    首先是,根据结果集能够,更好的理解程序,在者就是说,可以根据结果集,优化程序。书中提到了三种优化程序的方法,上限下压,下限上提,驱除重复的状态。

    上限,从cakeNumber*2,变化为(cakeNumber-1)*2,

     4  8  6  8  4  9 searchTimes: 164872
     Total swap times : 6

    变为:

     4  8  6  8  4  9 searchTimes: 141787
     Total swap times : 6

    下限书上面有具体的说明。

    最大下界[15n/14],最小的上界是:[(5n+5)/3]

    有时间研究一下,比尔盖茨的论文:http://www.eecs.berkeley.edu/~christos/papers/GP79.pdf

    关于如何发现状态重复的问题,如果使用 m_reverseCakeArray,可能是n!对于n较大的情况下,这个是不大现实的,可以利用比较简单的算法,圈定一定的空间来进行处理。这个算作是一个普通的想法吧,另外这中算法是分支限界法(即遍历+剪枝=分支限界),以后交流的时候,可能会用到

    关于这个,这个问题的动态规划或者贪心算法,会在下一个慢慢的研究。




    展开全文
  • 事实上你对于这个方法应该很熟悉了,这跟我们之间讲过的函数文档是一样的,就是写在模块最开头的那个字符串,这个字符串是带格式的,我们可以使用 print() 把这个格式打印出来。会更好看一点: 然后你可能需要...

    0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

    大家可能还不知道,在Python的社区里有句俗话:“Python自己带着电池(Batteries included)”,什么意思呢?要从Python的设计哲学说起,Python的设计哲学是:优雅、明确和简单。因此,Python开发者演变出来的哲学就是,用一种方法,最好是只有一种方法来做一件事。虽然我们常常努力大家多思考,条条大路通罗马,那是为了训练大家的发散式思维,但是在正式编程中,如果有完善、并且经过严密测试过的模块可以直接实现,那么我的建议是使用现成的模块来工作。

    所以Python附带安装的有Python标准库,一般我们说的电池就是Python标准库中的模块,这些模块都极其有用,Python标准库中包含一般任务所需要的模块,不过呢,Python标准库包含的模块有100多个之多,一个个单独来讲那着实是不科学的,所以这一讲,我们将学习如何独立的来探索模块。

    对于Python来说,学习资料其实一直都在身边(Python不仅带着电池,还带着充电器....),我们这里给大家分析,遇到问题,我们应该如何去找答案,其实90%的答案你都可以通过我们以下的方式来找到解决的方法。

    首先要做的就是打开Python的文档,IDLE-Help-Python Docs(F1),如图:

    What the huck!!! 都是鸟文啊,我看不懂怎么办,不会的话当然是学啊,说实话,对于一个程序员来说,还是需要一定的英语基础的,因为对于经济全球化的今天,最新最全的文档基本上都是鸟文的,所以你一点都不懂英语真的是很被动。不过大家也不要气馁,对于变成来说,只需要掌握基本的单词就行。

    我们接着讲,那这个文档的基本部分包括哪些呢?

    (1)What's new in Python3.5?

    介绍了相比Python2.0来说的新的变动。

    (2)Tutorial

    简易的Python教程,简单介绍了Python的语法。

    (3)Liberary Reference

    Python的整编书,这里详细列举了Python所有内置函数和标准库的各个模块的用法,非常详细,但是,你从头到尾是看不完的,当做字典来查就可以了。

    (4)Inatalling Python Modules

    教你如何安装Python的第三方模块

    (5)Distuributing Python Modules

    教你如何发布Python的第三方模块,你需要知道,Python除了标准库的几百个官方模块之外,还有一个叫做 pypi 的社区,网站为:https://pypi.python.org/pypi 搜集了全球Python爱好者贡献出来的模块,你自己也可以写一个模块发布到pypi社区,分享给全世界。

    关于第三方模块,我将会在后面的笔记中为大家整理,

    (6)language reference

    讨论Python的语法和设计哲学

    (7)Python setup and usage

    谈论Python如何在不同平台上安装和使用

    (8)Python HOWTOs

    针对一些特定的主题进行深入并且详细的探讨

    (9)Extending and Embedding

    介绍如何用 C和 C++ 来开发Python的扩展模块,还有开发对应所需要的API

    关于用 C和 C++ 为Python开发扩展,也会在后面的笔记中谈到。

    (10)FAQs

    常见问题解答

    另外大家可能经常会看到的就是类似于这个 PEP 这个词语

    PEP是Python Enhancement Proposals 的缩写,翻译过来就是Python增强建议书的意思。它是用来规范与定义Python的各种加强和延伸功能的技术规格,好让Python开发社区能有共同遵循的依据。

    每一个PEP都有一个唯一的编号,这个编号一旦给定就不会再改变。例如,PEP 3000 就是用来定义 Python 3.0 的相关技术规格;而PEP 333 则是 Python 的 Web 应用程序界面 WSGI (Web Server Gateway Interface 1.0)的规范。关于PEP 本身的相关规范定义在 PEP 1,而PEP 8 则定义了 Python 代码的风格指南。

    有关 PEP 的列表大家可以参考 PEP 0 :<https://www.python.org/dev/peps/>

    接下来就来举个实例,说说我遇到问题是怎么自救的,前阵子,我们不是举了一个计时器的例子吗,后来在第44课的课后作业的最后面,我们说,现实编程中,计时器工具千万不要自己动手写,因为有很多未知的因素会影响到你的数据,所以我们建议使用现成的模块,这个模块叫做 timeit,来对你的代码来进行计时。假设我们现在不知道 timeit 模块的用法,我应该如何入手呢?

    那我们就开始来翻刚才这个文档了,我们可以使用它的搜索、索引功能,一般给出的第一个都是你需要的

    如果你认为快速学习一个模块都要读这么长一篇长篇大论,那你真是  too young too simple 了,快速掌握一个模块的用法,事实上可以使用IDLE 交互界面,首先 import 该模块,然后可以调用 __doc__属性,这样就可以查看到这个模块的简介,如图:

    事实上你对于这个方法应该很熟悉了,这跟我们之间讲过的函数文档是一样的,就是写在模块最开头的那个字符串,这个字符串是带格式的,我们可以使用 print() 把这个格式打印出来。会更好看一点:

    然后你可能需要知道这个模块里面定义了哪些变量,哪些函数,哪些类,你可以用 dir() 内置方法把它显示出来:

    >>> dir(timeit)
    ['Timer', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_globals', 'default_number', 'default_repeat', 'default_timer', 'dummy_src_name', 'gc', 'itertools', 'main', 'reindent', 'repeat', 'sys', 'template', 'time', 'timeit']

    显示出来的这些并不是所有的名字对我们都有用,所以我们需要过滤一些我们不需要的东西,那你可能留意到 __all__这个属性了,这个属性其实就是帮助我们完成过滤的过程,我们调用 __all__属性:

    >>> timeit.__all__
    ['Timer', 'timeit', 'repeat', 'default_timer']

    它返回给我们的依然是一个列表,但是相比上面的来说,只有其中的4个成员,如果你有看前面的关于 timeit 的文档的话,你会发现,Timer是一个类,timeit、repeat、default_timer 是3个接口函数。所以,我们这个 __all__ 属性显示出来的就是这个模块可以供外界调用的所有东西。

    这里有两点需要注意的,首先,不是所有的模块都有 __all__ 属性,有 __all__ 的话,这个属性里面包含的内容就是作者希望外部调用的名字,其它的就是不希望外部调用的了。其次,第二点就是,如果一个模块设置了 __all__ 属性,那么使用 from ‘模块名’ import * 语句导入到命名空间的操作,只有 __all__ 属性这里面的名字才能被导入。例如:

    >>> from timeit import *
    >>> Timer
    <class 'timeit.Timer'>
    >>> gc
    Traceback (most recent call last):
      File "<pyshell#8>", line 1, in <module>
        gc
    NameError: name 'gc' is not defined

    找 Timer 就可以找到,但是找 gc 就找不到。

    但是如果你没有设置这个 __all__ 属性的话,from ‘模块名’ import * 就会把所有不以下划线开头的名字都导入到当前命名空间,所以,我们建议,你再编写模块的时候,对外提供接口函数和类都设置到 __all__ 属性的列表中去,这样子是比较规范的做法。

    还有一个属性叫做 __file__ 属性,这个属性是指明了该模块的源代码所在的位置

    >>> import timeit
    >>> timeit.__file__
    'D:\\ProgramFiles\\Anaconda3\\lib\\timeit.py'

    我们说过,快速提高编程能力有三大法宝,一个就是不断地编写代码,第二个就是阅读高手的代码。

    这里提供了源代码的路径,我们就可以去找到它,并通过阅读它的源代码,吸取它的精华。

    最后我们还可以使用 help() 函数

    在本节课的最后,我需要提一点的就是,timeit 这个模块真的是太有用了,所以呢,我这里有对应的文档的中文详解 -> timeit 模块详解。大家有空的话,建议通读一下。


    测试题(笔试,不能上机哦~)

    总共 16 道题,不上机的情况下答中 14 道以下请自觉忏悔!

    注:题目虽然简单,但有陷阱,反正这一讲也没什么要测试的,就考考大家常识^_^

    0. 请问以下代码会打印什么内容?

    >>> def func():
        pass
    
    >>> print(type(func()))

    A. <type 'function'>
    B. <type 'tuple'>
    C. <type 'NoneType'>
    D. <type 'type'>

    答:C

    1. 请问以下代码会打印什么内容?

    >>> print(type(1J))

    A. <type 'unicode'>
    B. <type 'int'>
    C. <type 'str'>
    D. <type 'complex'>

    答:D

    2. 请问以下代码会打印什么内容?

    >>> print(type(lambda:None))

    A. <type 'NoneType'>
    B. <type 'function'>
    C. <type 'int'>
    D. <type 'tuple'>

    答:B

    3. 请问以下代码会打印什么内容?

    >>> a = [1, 2, 3, "FishC", ('a', 'b', 'c'), [], None]
    >>> print(len(a))

    A. 13
    B. 7
    C. 6
    D. 5

    答:B

    4. 请问以下代码会打印什么内容?

    class A:
    def __init__(self, x):
        x = x + 1
            self.v1 = x
    
    class B(A):
        def __init__(self, x):
            x = x + 1
            self.v2 = x
    
    >>> b = B(8)
    >>> print("%d %d" % b.v1, b.v2)

    A. 9 10
    B. 9 9
    C. 10 10
    D. 抛出异常

    答:D

    5. 请问以下代码会打印什么内容?

    class A:
        def __init__(self, x):
            self.x = x
            x = 666
    
    >>> a = A()
    >>> a = A(888)
    >>> a.x

    A. 666
    B. 888
    C. None
    D. 抛出异常

    答:B

    6. 请问以下代码会打印什么内容?

    values = [1, 1, 2, 3, 5]
    nums = set(values)
    
    def checkit(num):
        if num in nums:
            return True
        else:
            return False
    
    for i in filter(checkit, values):
    print(i, end=' ')

    A. 1 2 3 5
    B. 1 1 2 3 5
    C. 1 2 3 4 3 2 1
    D. 抛出异常

    答:B

    7. 请问以下代码会打印什么内容?

    values = [1, 1, 2, 3, 5]
    def transform(num):
        return num ** 2
    
    for i in map(transform, values):
        print(i, end=' ')

    A. 1 1 4 9 25
    B. 1 1 2 3 5
    C. 0.5 0.5 1 1.5 2.5
    D. 2 2 4 6 10

    答:A

    8. 请问以下代码会打印什么内容?

    class A:
        def __init__(self, x):
            self.x = x
    
    a = A(100)
    a.__dict__['y'] = 50
    print(a.y + len(a.__dict__))

    A. 2
    B. 50
    C. 51
    D. 52

    答:D

    9. 请问以下代码会打印什么内容?

    class A:
        def __init__(self):
            pass
        def get(self):
            print(__name__)
    
    >>> a = A()
    >>> a.get()

    A. A
    B. a
    C. __main__
    D. _A__a

    答:C

    10. 请问以下代码会打印什么内容?

    country_counter = {}
    
    def addone(country):
        if country in country_counter:
            country_counter[country] += 1
        else:
            country_counter[country] = 1
    
    addone('China')
    addone('Japan')
    addone('China')
    addone("American")
    
    print(len(country_counter))

    A. 0
    B. 1
    C. 2
    D. 3

    答:D

    11.请问以下代码会打印什么内容?

    dict1 = {}
    dict1[1] = 1
    dict1['1'] = 2
    dict1[1.0] = 3
    
    result = 0
    for each in dict1:
        result += dict1[each]
    
    print(result)

    A. 2
    B. 3
    C. 5
    D. 6

    答:C

    12. 请问以下代码会打印什么内容?

    def dostuff(param1, *param2):
        print type(param2)
    
    dostuff('apples', 'bananas', 'cherry', 'dates')

    A. <type 'int'>
    B. <type 'str'>
    C. <type 'tuple'>
    D. <type 'dict'>

    答:C

    13. 请问以下代码会打印什么内容?

    class A:
        def __init__(self, a, b, c):
            self.x = a + b + c
    
    a = A(1,2,3)
    b = getattr(a, 'x')
    setattr(a, 'x', b+1)
    print a.x

    A. 1
    B. 2
    C. 6
    D. 7

    答:D

    14. 请问以下代码会打印什么内容?

    list1 = [1, 2]
    list2 = [3, 4]
    
    dict1 = {'1':list1, '2':list2}
    dict2 = dict1.copy()
    
    dict1['1'][0] = 5
    
    result = dict1['1'][0] + dict2['1'][0]
    print(result)

    A. 5
    B. 6
    C. 8
    D. 10

    答:D

    15. 请问以下代码会打印什么内容?

    import copy
    
    list1 = [1, 2]
    list2 = [3, 4]
    
    dict1 = {'1':list1, '2':list2}
    dict2 = copy.deepcopy(dict1)
    
    dict1['1'][0] = 5
    
    result = dict1['1'][0] + dict2['1'][0]
    print(result)

    A. 5
    B. 6
    C. 8
    D. 10

    答:B

    展开全文
  • 3D打印Arduino单片机盒子

    千次阅读 2017-04-21 10:50:42
    研一的时候实验室刚买的MakerBot打印机,到现在已经廉颇老矣……试着打印了个Arduino的盒子,刚开始打印基底的时候还挺平整,后面不知道是受力不均还是咋的,四周边角开始弯曲变形。没记错的话这台打印机当时价值2w...
  •   同事求助,工作中经常有一大批Excel表单需要打印,并且打印出来表单是有顺序要求,文件名已经排好了顺序,打印也要按这个顺序打。问我有没有什么快捷的办法。 初次解决   刚开始没仔细想这个问题,无非就是...
  • 深度学习相关最新图书推荐

    千次阅读 2017-05-01 11:41:00
    和其他的手册书一样,这本书主要关注在代码上,如果你还不知道一个卷积神经网络的输入和输出是什么,那么直接读它就会觉得有一些困惑,所以入门的话不推荐此书。 如果你已经看过其它的书,实战了一些例子,那么这...
  • Lua 打印table表内容

    2019-12-10 21:40:35
    刚接触lua时间不长,但是确实觉得lua的短小精悍,写代码的时候感觉非常的自由,最重要的是 不会稍不注意间就蹦出来个崩溃提示框。... 在进入标题内容之前,先来点前奏,大家也可以直接到最下面哈 ...
  • 有个朋友看点击打开链接 里的三个线程“A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。” 这个问题的代码,有点不太理解,让我给看下。不理解的原因也很简单,就是对wait和...
  • 对于项目开发中使用到打印的地方会非常多,在.NET项目中,选择打印的方式比较多,例如原始的IE网页打印、水晶报表、JS插件实现打印、导出文档打印,以及今天提到的使用itextSharp组件实现PDF打印等等。 在.NET中...
  • 微信读书产品调研报告

    千次阅读 2020-02-14 21:36:15
    阅读过程中看到喜欢的语句可以制作为书签,没事的时候看几眼,或者打印出来贴在墙上,妥妥的文艺小青年。 产品的亮点功能对应的应该是用户的兴奋型需求,导出笔记的功能为喜欢重温书籍的用户节约了时间成本,但是...
  • 这两道题都是求最长回文的长度,在这里我已开始想着就是没有思路,想了半天,然后了会儿,找到了一个知识点,那就是manacher算法 这个算法很好的解决了这道难题,然后我子啊百度上边找啊找,找到了这个,最后也...
  • [转]Java 实现 POS 打印机无驱打印

    千次阅读 2010-06-10 18:34:00
    通过java不使用驱动打印的方法以后也许会用到,先储备起来
  • 比特股(BitShares)白皮书

    万次阅读 2019-05-18 08:09:01
    不幸的是,比特币,就其他所有现存的加密货币一样,受制于价格波动和低流动性,同时也无法方便地在一个透明的全球性市场上与黄金和美元等资产进行交易,用户必须借助于中心化的交易所和清算中心才能买卖加密货币, ...
  • 这些工作交给程序员来做也许会更麻烦,于是行癫出手了,他写了一个数据库路由的框架DBRoute,统一处理了数据的合并、排序、分页等操作,让程序员使用一个数据库一样操作多个数据库里的数据,这个框架在淘宝的...
  • 好书推荐,《程序员修炼之道》

    千次阅读 2019-10-28 17:53:54
    把小诊断消息打印到屏幕上或者文件中,例如什么printf或者System.out.println之类的;  b.栈的踪迹(Stack trace)。 3.橡皮鸭:对着别人解释你的代码,说着说着Bug就出来了; 4.消除过程:找问题先找自己的...
  • 我一看,个柜子一样,是一个复印机。人家说,彩色的,18万美元呢。那个时候说白了,我心里也没谱,原来看都没有看过。我就说修好了,你怎么也要给我三四千块钱,如果没修好,万一修坏了,我也不赔。他说这个没关系...
  • wireshark数据包分析实战 读书笔记

    万次阅读 2016-03-10 23:13:15
    由头之前读了很多书籍,但是现在回顾的时候,很多内容仅仅是熟悉,而不是真正掌握。所以尝试一种新的方式,将读书时觉得比较重要的,或者是自己还不理解的东西...达到这本书我已经不需要再去,只要看笔记即可的效果。
  • 我一看,个柜子一样,是一个复印机。人家说,彩色的,18万美元呢。那个时候说白了,我心里也没谱,原来看都没有看过。 我就说修好了,你怎么也要给我三四千块钱,如果没修好,万一修坏了,我也不赔。 他说这个没...
  • 《iOS 开发进阶(唐巧)》读书笔记

    千次阅读 2017-05-05 09:17:54
    这本书前年就有所耳闻,网上的评价也褒贬不一,唐巧写的相对来说,语言通俗易懂,感觉是博客一样,没有什么限制,读起来很畅快。这本书适合初学者,虽然这本书大部分内容之前都已经熟悉掌握,但是看过一遍还是很有...
  • 感觉里面的知识和的架构给人非常"合理"的感觉。怎么个合理法呢? 首先中的代码,如else-if中使用binsearch函数介绍二分查找、atoi介绍字符串s转换为整数、计算器逆波兰表达式,都是实际中非常经典且常用的知识;
  • (3)这里有个很好玩的地方就是:你同时按住进纸和暂停按钮几秒钟再同时松开,打印机就会自动校正纸张一样重复出纸和收纸(但它只会一直进行下去,  不会别的打印机当纸张校正到正确位置就可以自动停止) ...
  • Actors in Scala(Scala中的Actor)(预打印版) 第一章 Concurrency Everywhere (A) guibin.beijing@gmail.com 2011.09.29 写在原文开始翻译之前的一些琐事。 本人在2003年结识了J
  • 2013.10-2015.9 图书馆借阅书籍情况

    千次阅读 2015-09-21 13:01:03
    《嗨C语言》运用认知科学和学习理论的最新成果,精心为你打造了一次多感官的学习体验,绝对能够嗨你的大脑,激发你的学习热情。它的特别之处是: 用图片等可视化手段,提高学习效率; 使用对话和有个性的叙述...
  • 列表一样,“字典”是许多值的集合。但不列表的下标,字典的索引可以使用许多不同数据类型,不止是整数。字典的索引被称为“键”,键及其关联的值被称为“键-值”对。 在代码中,字典输入时带花括号{}。在交互...
  • 金条 项目最大收益(贪心问题) 并查集实现 并查集入门三连:HDU1213 POJ1611 POJ2236 HDU1213 POJ1611 POJ2236 线段树简单实现 功能:一样的,依旧是查询和改值。 查询[s,t]之间最小的数。修改某个值。 那我们继续...
  • 单独窗口打印放大字号缩小字号 本文由论坛会员德鲁伊分享 Leaves是由Tow Brow开发的一个简单的图书翻页控件,它巧妙地结合了镜像层、阴影层(用于半透明页)和渐变层(用于阴影)来实现图书的翻页...
  • PDF书签制作

    千次阅读 2009-02-10 13:38:00
    1.先打开一本PDF电子书,最好打印一份目录。这样会方便些,没有也行!2.按左边的书签(bookmarks),就横向拉出一个书签栏来。按一个书签图形(在书签栏上方,options)有向下小箭头的,出现下拉菜单,点newboomark...
  • 鸟哥的Linux私房菜 读书笔记

    千次阅读 2015-06-19 10:51:50
    USB随身碟 —————— /dev/sd[a-p] (与SCSI硬盘一样) CDROM --—————— /dev/cdrom 软盘机 ——————  /dev/fd[0-1] 打印机 —————— /dev/lp[0-2] 鼠标 —————— /dev/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,171
精华内容 4,468
关键字:

如何像翻书一样打印