实习整理(十一)

原创 2015年11月20日 17:34:59
6.最长公共子序列和最长公共子串都可以用动态规划的方法来解决,递归的方式如下:
最长公共子序列  L[i][j] = (s[i]==t[j]) ? L[i-1][j-1] + 1:max(L[i-1][j],L[i][j-1])    L[i][j] ---- 子序列X1...Xi和子序列Y1...Yj的最长公共子序列的长度  数组下标从1开始 ,如果下标从0开始,就类似于下面这样

最长公共子串  L[i][j] = (s[i]==t[j]) ? L[i-1][j-1] + 1:0     L[i][j] ---- 子序列X1...Xi和子序列Y1...Yj的最长公共子串的长度
数组下标也是从1开始,如果下标从0开始,就类似于这样

动态规划的时间复杂度:O(n*2)  空间复杂度:O(n*2)
典型的以空间换时间的做法
连续子串:和最大  乘积最大(动态规划)
子序列:和最大  乘积最大
 

7.二叉树可以有许多种算法题,感觉基本上是可以用递归解决的,递归出口可以考虑根节点的情况,递归体一般就是递归左子树,递归右子树,当然有许多的细节还是要注意的,递归虽然从思想上来说比较简洁,但它需要额外的空间存储中间的临时数据,因此空间效率比较低,以LCA(最低公共祖先)问题为例
如果是二叉查找树,则只需要判断根节点和两个节点之间的大小关系,若根节点的值大于节点的值,则节点就在根节点的左子树中,之后递归左子树进行判断;若根节点的值小于节点的值,则节点就在根节点的右子树中,之后递归右子树进行判断;若根节点的值在两个节点值的中间,则两个节点的最低公共祖先为根节点
如果是一般的二叉树,则先判断两个节点是否在同一边,如果不在,则最低祖先为根节点,如果都在左边,则递归左子树,判断两个节点在左子树的情况,如果都在右边,则递归右子树,判断两个节点在右子树的情况
更多有关二叉树的面试题可以参考:http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

8.求连续子数组之和
我觉得把握两个重点即可:1.若累加和<0,则累加和清0;2.若累加和大于当前的最大值,则最大值重新赋值为累加和

9.求一个数组中最小的k个元素
之前我自己的思路就是:1.堆排序的方法:将n个元素建堆(小堆),输出堆顶元素,接着调整堆,输出堆顶元素...O(klogn+n)
                                    2.快速排序的方法:以第一个元素作为主元,找到主元所在的位置,如果为m,若m=k,则输出前面k个元素;若m>k,则在前m个元素继续寻找排序后主元位置为k的元素,若m<k,则在后半部分的元素中继续寻找排序后主元位置为k-m的元素

但在网上看到其他的解决方法,我觉得比较可取的方法有先遍历前k个元素,找出k个元素中最大的元素kmax,之后将剩下的元素和kmax进行比较,若大于,则替换,否则不做任何操作,时间复杂度为O(n*k)
此外,研究者的博客说快速选择的方法可以使时间复杂度达到O(n),基本思想就是快速排序,只是主元的选取要随机或者主元为中位数,大概看了下,写的有点有点杂,不知道正确与否

10.关于字符的算法问题有一个比较好的想法,不考虑空间复杂度的话,比如说查找两个字符串中公共的字符,或者删除某字符串中出现在另一字符串中的字符等等,可以考虑这样做:
借助一个字符数组,因为字母就26或者52个,所以数组为25或者52个单元
还发现另外一种比较有意思的做法,就是将其中一个字符串映射成某一个素数,所有的字符都进行完如上操作后,将字符映射后的素数相乘,对另一个字符也进行素数映射,然后用前面一个字符串映射之后的乘积除以另一个字符串中的每一个字符,若余数为0,则该字符为公共字符,否则,不是。。。。思想很巧妙

11.再一次发现自己思维愚笨,一个问题有多种思路,所以要开拓思维(亲和数的求解过程就证明了思维真的很重要。。而我还是太笨了)
比如求两个日期之间相差的天数,我第一直觉就是去判断这两个日期年,月,日的大小,然后相减什么的,虽然这样也做得出,而且实现也并不复杂,但是很明显感觉复杂化了,其实只要找一个标准点,将这两个时间都与标准点进行比较,就能很明显的判断出他们的间隔了

12.寻找水王的变型题:出现次数等于数组一半的元素,那就可以将最后一个数去掉,这样就变为寻找水王的题,就可以用candidate和次数两个变量判断

13.翻转可以不改变数组的原有顺序,很多问题可以借助于这一点

从这些算法的思考过程当中学习到了一定那就是很多时候要学会去简化问题,我觉得自己在这一点上做的很不好,思维也跟不上,因此,还是需要多多锻炼了。。。
未完待续。。。


实习小结十一:PHP实现每周排名(随排名变化,箭头改变)

我这边实现的主要是根据上周的排名,来与目前的排名进行对比,如果排名上升,就是上升的红色箭头,箭头随排名发生改变。 具体看部分代码: rankarray是存储上周的排名的数组;rank_array是...

JAVA学习笔记整理十一(数据库编程)

JDBC 1.    JDBC就是将java语言与SQL结合的一个很好的编程接口,可以向数据库中发送各种SQL命令 2.    JDBC本身提供的是一套数据库操作标准,而这些标准需要各个数据库厂商...

软件工程习题整理十一(中英对照)

Which technique is not for obtaining information for the business model? A. interviewing B. send qu...
  • Rainary
  • Rainary
  • 2017年11月09日 14:35
  • 21

Unity5.4 Assetbundles十一:遇到的坑和整理的打包和加载流程(资源包更新的简易框架)

转载请注明出处! 关于Unity5.4 AssetBundle的最后一篇博文中,我把自己学习过程中遇到的坑和解决方法分享给大家,望广大学习者能够尽快掌握Assetbundle。遇到的坑:1、首先说明一...

Github开源Android资源整理(十一)优秀项目

第三部分 优秀项目 主要介绍那些Android还不错的完整项目,目前包含的项目主要依据是项目有意思或项目分层规范比较好。 Linux 项目地址:https://github.com/torvalds...

读书笔记整理十一:使用闪回和LogMiner

读书笔记整理十一:使用闪回和LogMiner 闪回数据归档比较 闪回数据归档技术与闪回数据库的比较: ? 使用闪回数据归档可以访问任意时间点的数据,而不会实际更改当前数据。这与闪回 数据库相反...

霓歌即时通讯中的相关专利整理(十一)

本文承接上一篇,继续对霓歌项目所涉及的相关的即时通讯的相关专利进行整理: 1、一种可以和微信公众号通讯的智能媒体终端装置     2、即时通信资料记录及后续管理方法 1、...
  • ly51212
  • ly51212
  • 2015年09月19日 10:05
  • 412

疯狂Android讲义(十一到十九章) 李刚

  • 2012年04月07日 22:47
  • 27.56MB
  • 下载

Unity UI(十一):多屏幕分辨率下的UI布局

多屏幕分辨率下的UI布局一般考虑两个问题:         1、布局元素的位置,即屏幕分辨率变化的情况下,布局元素的位置可能固定不动,导致布局元素可能超出边界;         2、布局元素的尺寸...
  • wkhabc
  • wkhabc
  • 2016年09月13日 16:38
  • 802
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实习整理(十一)
举报原因:
原因补充:

(最多只允许输入30个字)