zoukankan      html  css  js  c++  java
  • 《编程之美》读书笔记二

    PB15151793 陈灿


    今天又抓紧时间把《编程之美》第二章《数字之魅》看完了,并且看完了第三章《结构之法》。为什么这么急?因为感觉面试可能在任意一个时间点过来,早早准备为妙。

     

    发散性思维

    我感觉《编程之美》这本书其实很在乎一种发散性思维,即我们现在解决了问题A,能否改变一些条件,生成一个新的问题B,然后尝试去解决问题B。一般来说改变的条件就是我们之前在题目中加入的一些限制条件,我们通过去除这些限制,使得问题泛化。当然解决难度也会更大。我觉得这是非常重要的思维习惯,能帮助我们在短时间内熟悉一类题目,真正达到融会贯通。
    还是举一个例子吧:

     求N个元素的一维数组中子数组和的最大值。
    

    这里我就不绕弯子了,直接给出O(N)的解法。这个问题,如果从前往后思考,涉及到数组的更新很麻烦。但是如果从后往前思考,会给人一种柳暗花明的感觉。记终止于下标i的最大和数组为S[i],那么当我们想得到S[i+1]的时候,只需要看看S[i]是否大于0,大于0就加上A[i+1],作为S[i+1],否则就只考虑A[i+1]作为S[i+1]。重点其实在后面,关键在于观察作者是如何做这个扩展的,以及如何对待改变的条件。作者把题目做了一个扩展,即此数组头尾可以连接起来,仍然是求子数组之和的最大值。这里我们实际上我们只需要增加一种情况的分析即可,即A[0]和A[N-1]连接起来了,即求开始于A[0]的最大子数组和终结于A[N-1]的最大子数组。后者易得,对于前者,实际上我们只需要比较各个以A[0]开头的子数组就行了。合并的时候注意一些细节就行了。最让我佩服的是作者在此又对原问题进行了扩展,即

    求NxM个元素的二维数组中子矩阵和的最大值。
    

    对于这个问题,我们又该如何分析尼?其实一般来说,这类拓展问题的解决依赖于原问题的解决。那么,最重要的就是抓住原问题和拓展的联系和区别。联系是都是求子矩阵和最大值(原问题子矩阵一个维度是1),区别在于连个问题的维度不同,那么我们通过什么操作能使得拓展问题降维尼?作者这里是这样做的,先确定2行,假定子矩阵的上下边界就是这两行,然后把每一列的和看成一维数组中对应的值,这样就可以采用问题的操作了。这里复杂度是O(N^2*M),那么我们再思考一下我们这样降维能化简到子问题的本质是什么?为什么这里我们能把列和求出来转化为一维问题?我的答案是,因为这是个二维矩阵啊,确定了列里的一个元素,当然这一列都要被选中了。可能有人会认为我这个问题很弱智,但是我觉得最朴素的道理就是这么弱智,只有问题的思考深度达到了“弱智”的程度,才能真正理解这个问题。
    之后作者又做了很多扩展,比如二维矩阵左右可以连接,甚至上下可以连接,甚至扩展到三维矩阵。但我认为万变不离其宗,只要掌握问题的本质,就能解决这类问题。

     

    最难的简单题

    感觉MS在面试的时候,其实很看重解决面试者实际coding解决一些简单问题的能力。因为感觉一个很普遍的情况是我们平时上机实验的时候,很多人会看着课本的例程去编写程序,这样是很不好的。因为有些代码看起来很简单,但是实际上你写起来坑挺多的。如果这类代码,你只是看着课本编,你当时一定会觉得很简单,因为从思想上来说,真的很简单。但是一离开课本就什么都不会了。比如一个二分查找的问题,找到一个有序数组中大于val的第一个值的下标,里面坑真的挺多的。这个就是我面试MSRA的时候遇到一个问题,不说了,满满的都是泪。此外,还有很基础的课本上的题目也是会被问道的,比如写一个程序,由先序序列和中序序列确定二叉树的构造,虽然这个问题是课本上的问题,但是公司真的会问,不要觉得这种问题老套,反应基本功的问题一般都是一些老套的问题。对于这类问题,很容易出错的地方往往在于边界点,我一点也不支持:先写个大概,然后边界问题再调整一下这种说法。因为抱着这种想法的人,一定不理解每个变量的意义。coding的过程是反映一个人思考问题的过程,如果面试者清楚每个变量的含义(这里具体就是指边界值啦),那么他写出来的程序在处理边界问题上就一定是严谨的!这样的数理逻辑思维值得肯定!

     

    链表追赶,环判断问题

    感觉这个哥们写的挺好的,我就不写了。。
    链表类问题总结

  • 相关阅读:
    二维数组最大关联子数组
    四则运算(终极版)
    最大子数组
    四则运算(三) 记录日志
    四则运算(三)
    四则运算记录日志
    四则运算(二)
    简单web四则运算出题
    Daily Scrum
    Daily Scrum
  • 原文地址:https://www.cnblogs.com/moee/p/8963725.html
Copyright © 2011-2022 走看看