
面试题总结
文章平均质量分 75
进击的小菜
这个作者很懒,什么都没留下…
展开
-
面试题系列-整数数组长度为n,分为m份使各份的和相等,求最大的m
这应该是网上比较常见的题目了,但由于本人新手,决定练练手,实现一下。解题思路:注意m,肯定能被数组的和整除,得到的结果是分成m份之后的和。可以考虑从m=n时开始递归,直接求得符合条件的m即为最大的,代码如下:#include using namespace std;int findsubsum(int a[],int n,int m,int goal,int aux[],int原创 2013-10-12 18:40:49 · 1272 阅读 · 0 评论 -
找数组中第k大的数
其实按照上一篇文章的思路,可以根据快排来计算第k大的数。但会修改数组中的数据,所以这里有新的不修改数据的思路:1、用multiset实现自动排序,大小为k,每个数与set中最大的数比较,如果小于则替换。2、可以用最大堆来实现,方法类似上面的。关键是看代码注释在下面。时间复杂度为:#include#include#includeusing namespace std;in原创 2014-03-14 20:41:49 · 642 阅读 · 0 评论 -
连续子数组的最大和
很常见的面试题目了,有两种方法:一、观察规律,因为是寻找连续最大和,需要遍历整个数组,用一个变量来记录所有连续和中最大的,用另一个变量来记录遍历过程中最大的。如果遍历过程中最大的变为0了,则说明后面的元素要重新计算最大值了。因为和之前统计的加上不会再增大。二、动态规划法。状态为f(i)表示以数组第i个位置结尾的连续最大和,状态方程为:如果f(i-1)小于等于0,则f(i)取当前位置的值,否原创 2014-03-14 21:33:00 · 390 阅读 · 0 评论 -
将二叉搜索树转换为双向链表(不创建新的结点)&&数组中出现超过一半的数字
转换的双向链表是从小到大顺序的,而二叉搜索树如果按照中序遍历则肯定是这个序列,所以要在中序遍历的过程中建立双向链表。而因为结点的左右指针都要在遍历中用到,所以创建一个新的遍历plast来记载已经找到的双向链表的最后一个结点,然后将其它结点与其连接。初始值为NULL。创建和遍历二叉树就不用再说明了,关键是链接的过程,详细参照代码。#include#include#includeus原创 2014-03-10 14:26:27 · 453 阅读 · 0 评论 -
从1到n的数中1出现的个数&&寻找丑数
从1到n的数中1出现的个数,最简单的思路就是从1到n求每个数字中1的个数,这样就是速度太慢了。可以寻找规律,假设数为abcde,c在百位上,求百位上的数字的方法:如果c等于0或者大于1,1的个数只与左边有关(即ab),如果c等于1,1的个数和左边右边都有关(即de)。具体见代码:#include#include#includeusing namespace std;int原创 2014-03-15 14:22:55 · 487 阅读 · 0 评论 -
找逆序的对数&&和为n的两个数字&&和为n的连续正数序列
11#include#include#includeusing namespace std;int temp[100];int findreversenum(int *numbers,int beg,int end){ if(beg == end){ return 0; } int mid,leftnum,rightnum,num = 0; mid = (beg+end)原创 2014-03-16 11:37:32 · 431 阅读 · 0 评论 -
不用if 、for等判断语句和乘除法求1+2..+n的值 &&不用加减乘除求两个数的和
11#includeusing namespace std;class Temp{public: Temp(){ ++N; SUM += N; } static void Reset(){ N=0;SUM=0;} static int GetSum(){return SUM;}private: static unsigned int N; static unsigne原创 2014-03-17 13:16:27 · 857 阅读 · 0 评论 -
n个骰子,求所有可能和出现的概率&&约瑟夫环
11#include#include#include#includeusing namespace std;void basegetdicechance(int *totalsum,int current,int sum,int k){ if(current == 0){ ++totalsum[sum-k]; return; } for(int i =1;i<=6;+原创 2014-03-17 12:07:06 · 586 阅读 · 0 评论 -
字符串的全排列与拓展
1、求字符串的全排列的思路是这样的:求字符串的第一个全排列,在此基础上,对于第一位已经确定的情况下求后面所有位的全排列。而从第二位开始求的步骤也和第一位相同,即求第二位的全排列,同时在第二位确定的情况下求后面所有位的全排列,每个位的求法可以依次与它后面位置的字符交换来取得,其实此题是比较简单的,关键是涉及一个经典的算法-回溯法。代码如下:#include#include using n原创 2014-02-28 11:03:06 · 522 阅读 · 0 评论 -
根据树的后序判断是不是二叉搜索树&&二叉树中和为某一值的路径
根据树的后序判断是不是二叉搜索树#include#includeusing namespace std;bool IsSearchBinaryTree(int *numbers,int begin,int end){ if(numbers == NULL || begin>end) return false; if(begin == end) return true; in原创 2014-03-07 19:19:24 · 479 阅读 · 0 评论 -
顺时针输出矩阵
比如矩阵是:1 2 3 45 6 7 89 10 11 1213 14 15 16则输出顺序为 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10。则思路就是一圈一圈的输出,比如上面矩阵中里面的一圈是6 7 11 10。那么在实际编程时,要分情况注意按行和列输出,因为存在内部的"一圈"只是原创 2014-03-06 21:38:07 · 694 阅读 · 0 评论 -
一个数组由递减数列左移若干位形成,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在数组中查找某数
首先观察数组的规律,虽然移动了,但按照二分的思想,仍然可以分为两 部分:一部分是有规律递减的,另一部分是没规律的(但可以看成原问题的子问题)。所以在寻找特定数时,可以判断是否在递减数列中(递减数列也分为左边或右边),如果存在则在递减数列中二分查找,如果不存在则递归的调用另外一半来进行查找。代码如下。#include using namespace std;int BinarySearch原创 2013-10-14 22:22:24 · 1038 阅读 · 0 评论 -
两个问题:n对括号有多少种匹配方式与与最长递减子序列
一.n对括号有多少种匹配方式首先想到的思路就是列出所有可能并对符合条件的进行计数。考虑采用回溯法,即将括号列表看做是字符串,对于字符串i位来说:要么是左括号→ 递归到i+1位;要么是右括号,递归到i+1位。之后所有位都列好后进行判断,是否符合条件。在统计过程中如果某个步骤右括号的数目大于左边括号的数目,或者统计完成后左右括号数目不等,则不符合条件。代码如下。#include usin原创 2013-10-14 15:39:43 · 999 阅读 · 0 评论 -
网易笔试题-求有向连通图的割点
首先,明白割点定义:如果去除此点,则有向图不再连通。割点的具体情况可以结合下面的图来分析:可以看到,割点有两种情况(通过深度优先搜索树来遍历):1.如果是根节点,且有大于或等于两个以上的子树,则为割点。2.如果不是叶节点的某节点node(比如节点J,K是叶子节点,但他们不属于割点),对于node来说它的子结点及后继结点没有指向node的祖先的回边,则为割点。譬如图中的E结点,它原创 2013-10-19 01:09:14 · 995 阅读 · 0 评论 -
腾讯,迅雷,完美等公司的一些笔试题整理
迅雷:1.A *pa = new A[10];delete pa;则类A的构造函数和析构函数分别执行了几次()答案是10,1分析:如果要删除数组则应该使用delete [] pa,当调用delete pa时,实际上是调用析构函数,析构一个A对象。2.关于内联函数正确的是()A、类的私有成员函数不能作为内联函数B、在所有类说明中内部定义的成员函数都是内联函数C、类原创 2013-10-23 15:11:34 · 1878 阅读 · 0 评论 -
二叉树的前中后序非递归(复习)
注意:不是二叉排序树,只是普通的二叉树。相信二叉树的递归遍历对于很多人来说是很容易的,但这里要复习下非递归的实现。前序和中序的非递归遍历相对容易一些,前序是从根到左子树不停的访问然后入栈,等左子树遍历到空时,出栈,再指向它的右子树,按照之前的规律入栈,一直执行。。。而中序略微变化一下,在入栈时先不访问,出栈时对对应结点进行访问。后序访问也参考前两种解法,但注意根是最后访问的,所以如果第原创 2013-10-30 10:06:58 · 522 阅读 · 0 评论 -
笔试面试失败总结
感觉自己还是很菜,有的答的不够全,有的只是基本的方法(比如100万以内的质数)深深的鄙视自己。。。。不过失败是成功之母,总结下面试出错的地方吧。TCP/IP协议栈说的不够详细C++的类型转换虚函数实现的机制一亿个数排序100万以内的质数建立堆原创 2013-10-27 22:12:12 · 606 阅读 · 0 评论 -
用两个栈实现队列&&旋转非递减数列的最小值
用两个栈实现队列,#include#include#includeusing namespace std;templateclass MyQueue{ public: void push(T n){ a.push(n); } void pop(){ if(!b.empty()) b.pop(); else if(!a.empty()){原创 2014-03-05 15:27:22 · 475 阅读 · 0 评论 -
根据二叉树的前中序确定唯一的二叉树
关键是怎么根据前中序推出二叉树。假设前序为1245367,中序为4251637。那么根结点为1,在中序中找到1,则左边为1的左子树,右边为1的右子树。那么可以根据这个在前序序列中和中序序列中,分出1的左子树和右子树在进行按照1的计算方法分别计算,直到找到叶子结点。。可以确定树。关键是利用了树的递归性质。代码实现:先建树,然后算出其前序和中序序列,最后再根据序列求出树,看是否和刚开始建的树相同,原创 2014-03-04 18:02:55 · 1444 阅读 · 0 评论 -
链表专题[三种逆置方式和微软笔试题]
说起链表,是大家最熟悉的数据结构了,也是大学上课时比较先讲到的。那么是否真正掌握了呢。单链表逆置是最常考的题目,但完全写正确好像三种方式也没那么容易吧。第一种:非递归,思路就是从头结点开始,记录头结点的下一个结点,同时将头结点的指针指向之前的结点(设为NULL),然后将头结点的值赋给之前的结点,然后继续下一个结点的逆置,直到为空。第二种: 递归方式。思路就是一直递归,直到最后一个结点原创 2014-03-04 10:25:21 · 699 阅读 · 0 评论 -
实现自己的pow函数&&打印1到最大的n位数
实现自己的pow函数。貌似很简单,但要完美的实现也不易。1、浮点数的大小不能由 == 来决定。2、考虑基数为负数的情况。3、基数为0而指数为负数会出错。#include#include#includeusing namespace std;bool error;//浮点数比较bool equal(double a,double b){ if( (a-b-0.00000原创 2014-03-05 20:49:46 · 612 阅读 · 0 评论 -
将数组的奇数移到前面偶数到后面&&输出链表的倒数第k个结点
将数组的奇数移到前面偶数到后面,即采用前面和后面往中间去遍历,如果满足条件则交换的算法。关键是对于交换满足条件的判断,采用函数指针。#include#includeusing namespace std;bool Isodd(int n){ if(n%2 == 1) return true; else return false;}void reorder(int原创 2014-03-05 21:49:54 · 584 阅读 · 0 评论 -
判断树B是否为树A的子树&&求出树的镜像
判断树B是否为树A的子树。思路很简单,以B的根节点为标准,查找A中节点是否有相同的。如果有相同的,再判断两个子树是否相同。如果不同,则继续查找。#include#include#includeusing namespace std;struct Binarytree{ int value; Binarytree *left; Binarytree *right;};原创 2014-03-06 16:01:23 · 550 阅读 · 0 评论 -
union和struct的内存分配&&判断正方形&&函数的隐式转换
最近面试,关于内存分配的题居然答错了,复习下。原创 2014-04-10 15:11:51 · 569 阅读 · 0 评论