摘要: 题目:输入一个单向链表,输出该链表中倒数第 k 个结点。方案一:先遍历一遍,获取到链表的长度n,然后从头再走n-k步。分析:相当于遍历两遍,第一遍是为了获得链表的长度,而第二遍是找到倒数第k个节点。方案二:一个盲人怎么才能知道他到墙的距离是d?他可以拿一个长度为d的杆子,当杆子碰到墙了,此时他到墙的距离就是d了。基于上面的思想:1.指定一个新的指针p,走k步。如果k步之内就到了null,显然无倒数第k这说法,返回错误即可。2.新指针p到位后,在初始节点再设定一个新的指针root,然后两个指针一起走。当p为null时,输出root所指的节点即可。 阅读全文
posted @ 2013-10-29 18:24 欧麦高德 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一棵二叉树的根结点,求该树的高度。注释:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的高度。分析:当前节点的高度等于子数高度较大的值+1,递归实现。代码:int BTreeHight(根节点) { if (是叶子节点) return 1; 左子树高度 = BTreeHight(root->left); 右子树高度 = BTreeHight(root->right); int height; if (左子树高度>右子树高度) height = 左子树高度+1; else height = 右子树高度+1; retur... 阅读全文
posted @ 2013-10-29 18:22 欧麦高德 阅读(988) 评论(1) 推荐(0) 编辑
摘要: 快速排序基本思想:选定一个中枢元素,以其为基准点,将小于它的数放在其前面,大于其的数放在后面,把中枢元素放在最终合适的位置。然后再对左右两边分别递归。快速排序的基本步骤:1 初始时,以第一个元素作为中枢元素。低指针指向第一个元素,高指针指向最后一个元素。2 当中枢元素在低指针时,从高指针开始向前查询第一个小于中枢元素的数,并交换这个数和中枢元素。将中枢元素移到高指针的位置。3 当中枢元素在高指针时,处理方式同上相反。4 当高低指针指向同一个位置时,说明完成一轮排序,此时中枢元素处在了最终的位置上。5 之后,再对中枢元素两边进行相同操作。基本代码:public static void quick 阅读全文
posted @ 2013-10-26 09:02 欧麦高德 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一颗二叉树根节点,复制该树,返回新建树的根节点。分析:跟求二叉树的高度类似,使用递归调用,先序遍历即可完成。参考代码:BNode* CopyBST(BNode* root){ if(root == NULL) return NULL; BNode* sub_tree = new BNode; sub_tree->data = root->data; sub_tree->left = CopyBST(root->left); sub_tree->right = CopyBST(root->right); return sub_tree;}题目:判断两 阅读全文
posted @ 2013-10-14 19:23 欧麦高德 阅读(454) 评论(0) 推荐(0) 编辑
摘要: 题目:已知一个二维数组A[n][n],其中每行的元素按从小到大的顺序排好,每列的元素也按从小到大的顺序排好,问给定一个元素v,是否在数组中存在?方案一:暴力方法。逐个遍历进行比较。时间复杂度为O(n^2)方案二:对上面的方法进行改进,因为每行是有序的,对每行进行二分查找,共n行。时间复杂度为O(nlogn)分析:上述两个方案对规模较小的数组表现的性能比较好,并且有很好的可读性。 但方案一没有利用有序的条件,而方案二只是利用了行有序的条件,没有利用列有序的条件。方案三:从矩阵的右上角开始,即i=0, j=n-1开始遍历。若是小则向左,若是大则向下。边界条件是jn-1。时间复杂度为O(n)代码:w 阅读全文
posted @ 2013-10-09 19:47 欧麦高德 阅读(366) 评论(1) 推荐(0) 编辑
摘要: 题目:求N!末尾有多少个0方案一:暴力法。分析:这很容易造成溢出得到错误的结果,并且运算的时间也较长。若是面试的时候你这样解,那么可以say goodbye了。方案二:其实没有必要求出最后的结果再去数究竟有多少个0。 我们可对一个数进行分解,分解成尽可能小的数字相乘的形式(其实也就是尽可能小的素数相乘),你会发现0只会来源于2*5。所以我们可以看看有多少个2和5成对出现。 而在阶乘之中,显而易见2的个数一定是多于5的个数,所以我们就看看出现了多少个5。 以1234!为例,末尾为5的数有1234/5 = 246个,但这246个数中其实还有包含5存在的数(因为会包含25,125这种除以5之后,还. 阅读全文
posted @ 2013-10-07 10:10 欧麦高德 阅读(503) 评论(0) 推荐(0) 编辑
摘要: N个球放入M个盒子中的问题研究:本来这是组合数学中的问题,但近年来公务员考试,企业面试经常会涉及到这个问题。这个问题并非咋一看上去那么容易,不妨自己先动手计算一下下面几个题目:情形1 N个不同的球,放入M个不同的盒子,允许盒子为空的放法。情形2 N个不同的球,放入M个不同的盒子,盒子不为空的放法。情形3 N个相同的球,放入M个不同的盒子,允许盒子为空的放法情形4 N个相同的球,放入M个不同的盒子,盒子不为空的放法。情形5 N个相同的球,放入M个相同的盒子,允许盒子为空的放法。情形6 N个相同的球,放入M个相同的盒子,盒子不为空的放法。情形7 N个不同的球,放入M个相同的盒子,允许盒子为空的放法 阅读全文
posted @ 2013-09-30 20:20 欧麦高德 阅读(1963) 评论(0) 推荐(0) 编辑
摘要: 题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例:有5个台阶,则有8种跳法。思想:使用递归,因为每次只能跳一个或两个,那么当它在N级的时候一定是从第N-1或N-2级跳过来的。所以有f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2。方案一:直接对上述思想进行编码f(int n){ if(n==1) return 1; else if(n ==2) return 2; else return f(n-1)+f(n-2);}分析:使用这种方式,可读性很好,但是当n较大时,会非常耗时。例如,在我的笔记本上,n=... 阅读全文
posted @ 2013-09-29 09:30 欧麦高德 阅读(618) 评论(0) 推荐(0) 编辑
摘要: 题目:求(a^n)%p的值。方案一:暴力解法,先算出a^n的值,然后再去求模。分析:这种做法最简便直观,但缺点是运算性能不好,在输入较大时会产生溢出,导致结果错误。代码: public static long calMod1(int a, int n, int p) { // 暴力解法1 long sum = 1; for (int i = 0; i < n; i++) sum *= a; return sum % p; }方案二:暴力解法,循环求a^n的每一步中,将求模运算融入其中。分析:可读性上也是比... 阅读全文
posted @ 2013-09-24 20:02 欧麦高德 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 1 下载mysql(http://www.mysql.cn/),解压并安装。 若安装之后,可以打开mysql.exe,说明安装成功。 2 打开mysql.exe之后,输入mysql命令,建库/建表/插入...3 下载JDBC驱动(http://mysql.ntu.edu.tw/Downloads/Connector-J/mysql-connector-java-5.0.8.zip) (JDBC驱动是与java程序的接口, 使java语言开发的程序可以连接使用sql数据库。) 4 将JDBC驱动(即其中的jar包,在这里叫做mysql-connector-java-5.0.8-bin.j... 阅读全文
posted @ 2013-09-23 10:50 欧麦高德 阅读(314) 评论(0) 推荐(1) 编辑