面试题
bladeLight
这个作者很懒,什么都没留下…
展开
-
二叉搜索树转换为双向链表
昨天想了好久还是没有想明白,今天终于想明白了。其实我们只需要中序遍历一下二叉树,同时保留当前链表的最后一个指针pLast,以及当前指针pCurrent,每访问一个节点更新一下两者的值。还是需要充分理解中序遍历的含义。struct Node{ int data; Node* left,*right;};void transfer(Node* root,Node** pLas原创 2013-03-29 12:00:40 · 1055 阅读 · 0 评论 -
判断二叉树是否为平衡树
#includeusing namespace std;struct Node{ Node* left; Node* right; int data;};int isBalanceTree(Node* root,bool& flag){ if(root==NULL) return 0; int leftLen=isBalanceTree(root->left,flag);原创 2013-05-18 17:08:35 · 597 阅读 · 0 评论 -
全排列
#include#includevoid swap(char* str,int i,int j){ while(i<j){ char tmp=str[i]; str[i]=str[j]; str[j]=tmp; i++,j--; }}void permutation(char* str,int len){ if(str==NULL||len<=0) return;原创 2013-05-20 21:17:25 · 715 阅读 · 0 评论 -
顺时针打印矩阵
#includeusing namespace std;const int m=4;const int n=4;int mat[m][n];bool vis[m][n];int dir=1;void init(){ memset(vis,0,sizeof(vis)); int num=1; for(int i=0;i<m;i++) for(int j=0;j<n;j++原创 2013-05-27 15:21:02 · 487 阅读 · 0 评论 -
链表拆成两个链表(奇数链和偶数链)
#include#include#includeusing namespace std;struct Node{ int data; Node* next;};void exchange(Node* &p1,Node* &p2){ Node* tmp=p1; p1=p2; p2=tmp;}void transform(Node* head,Node* &head1,No原创 2013-05-20 22:46:45 · 4765 阅读 · 0 评论 -
寻找最长子串,该子串只包含两种字符
思路:初始时,i指向第一个字符,j指向第一个不等于i的字符,k从j+1开始找第一个不等于i和j对应字符的位置,另外设有变量rightMosti和rightMostj分别表示i和j对应字符在最右边出现的位置,i的下一个位置即为min(rightMosti,rightMostj)+1,j=k,k从下个位置开始找。时间复杂度为:O(n)。#includeusing namespace std;原创 2013-05-14 21:01:40 · 683 阅读 · 0 评论 -
随机提取中位数
题目:Numbers are randomly generated and stored into an (expanding) array. How would you keep track of the median?思路分析:使用两个堆,一个最大堆(存储小于中位数的一半的元素),一个最小堆(存储大于中位数的一半的元素),只要维护好这两个堆,根据堆顶元素就能得到中位数。我们的程序保证左右两原创 2013-07-27 23:02:18 · 888 阅读 · 0 评论 -
给定无序数组A,在线性时间内找到i和j,j>i,并且保证A[j]-A[i]是最大的。
void get_result(int A[],int n,int &from,int &to){ if(A==NULL||n<=0) return; int min=A[0],min_pos=0,max=-INT_MAX; for(int j=1;j<n;j++){ if(A[j]-min>max){ max=A[j]-min; from=min_pos; to=j;原创 2013-08-17 14:30:48 · 1632 阅读 · 0 评论 -
相伴一生
string get_substring(string str){ if(str=="") return ""; int len=str.length(),from,to,max1=-INT_MAX,max2=-INT_MAX; int* one=new int[len]; int* zero=new int[len]; int* diff=new int[len]; memset(o原创 2013-08-18 00:12:17 · 654 阅读 · 0 评论 -
堆中插入元素
只需要将最后一个位置++,将插入的值放入最后一个位置中,然后向上进行调整代码如下(最大堆):int cnt=0;int heap[1000];void heapInsert(int x){ cnt++; heap[cnt]=x; int i=cnt; while(1){ if(i==1) break; int p=i>>1; if(heap[p]>=原创 2013-08-31 21:54:31 · 1412 阅读 · 1 评论 -
1-n个元素中查找缺失的一个数
题意:已知一个有序数列1-n(元素值)中缺少了一个元素,找出这个元素。1、异或可解 时间复杂度O(n)2、二分 时间复杂度O(lgn)代码如下://二分查找有序数组中缺失的一个元素,时间复杂度尽可能低 int bsearch(int a[],int left,int right){ while(left<=right){ int mid=left+(right-le原创 2013-09-01 16:01:55 · 3329 阅读 · 2 评论 -
循环数组中查找一个数
int findRes(int a[],int l,int r,int x);int bsearch(int a[],int l,int r,int x);int findFunc(int a[],int n,int x){ if(a==NULL||n<=0) return -1; return findRes(a,0,n-1,x);}int findRes(int a[],in原创 2013-08-26 23:53:41 · 814 阅读 · 0 评论 -
链表分段反转
链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现#include#include#includeusing namespace std;struct Node{ int data; Node *next;};void原创 2013-09-11 17:42:16 · 1803 阅读 · 0 评论 -
圆圈最后剩下的元素
1、模拟看了一下list的实现原理才明白为什么迭代器的位置不用自动调整,list是用双向链表做的,vector是用数组做的,所以会有不同。//迭代器的删除//list的erase只会使指向被删除的迭代器失效,vector的erase有可能使后面的迭代器失效//猜想:list中是不是用个标记记录了被删除的位置,如果被删除则一直移动到第一个不被//删除的位置 #include#i原创 2013-05-15 23:20:02 · 560 阅读 · 0 评论 -
字典树的动态实现
//字典树的实现 #includeusing namespace std;const int num=26;struct trie_node{ trie_node():is_word(false){ for(int i=0;i<26;i++) child[i]=NULL; } trie_node* child[26]; bool is_word;};class原创 2013-05-17 12:24:51 · 919 阅读 · 0 评论 -
工场模式
工场模式创建一个框架,让子类决定要如何实现#includeusing namespace std;class Product{ public: Product(){} virtual ~Product(){}};class ConcreteProduct:public Product{ public: ConcreteProduct(){cout<<"Concrete原创 2013-05-17 21:59:18 · 487 阅读 · 0 评论 -
杨氏矩阵中查找某个数
#include#includeint m,n,t,i,j;int a[1005][1005];int main(){ while(scanf("%d%d",&m,&n)!=EOF){ scanf("%d",&t); for(i=0;i<m;i++) for(j=0;j<n;j++) sca原创 2013-03-30 16:45:52 · 1387 阅读 · 0 评论 -
不使用加减乘除实现加法
这里给出递归和非递归实现//不适用加减乘除实现加法操作int Sum(int num1,int num2){ int sum,carry; do{ sum=num1^num2; array=(num1&num2)<<1; num1=sum; num2=carry; }while(num2!=0); return sum;}in原创 2013-03-29 22:52:30 · 1059 阅读 · 0 评论 -
非递归实现归并排序
#include#include#define INF 0x7fffffff//归并排序的非递归实现//将[l,mid]和[mid+1,r]归并到一起 l<=mid<rvoid merge(int a[],int l,int mid,int r){ int i,j; int n1=mid-l+1; int n2=r-mid; int *left=new原创 2013-04-02 22:47:22 · 2760 阅读 · 0 评论 -
确定临界楼层
1、http://im47.cn/post/2011/04/2011-04-06-2006-google-interview-determine-critical-floor#top2、http://blog.csdn.net/jiaomeng/article/details/1435226原创 2013-04-04 17:33:27 · 1123 阅读 · 0 评论 -
将无向无环连通图转换成深度最小的树
树的深度取决于根节点到最深叶节点的距离,所以我们可以从叶节点入手。叶节点会且只会和某一个节点连通(反之不成立,因为根节点也可能只和一个节点连通),所以我们很容易找到所有可能的叶节点。题目可以等价于找到了两个叶节点,使得两个叶节点之间的距离最远。根节点就是这两个叶节点路径的中间点(或者中间两个点的任意一个)。我们可以每次都将连接度为1的节点删掉,直到最后只剩下1个或2个节点,则这一个节点,或转载 2013-04-04 21:23:22 · 2477 阅读 · 0 评论 -
输出二叉树路径上的所有和为K的路径
太坑爹了1、可能有负值2、左右子树的大小不保证左边#include#include#includeusing namespace std;int n,k;struct Node{ int v,id; Node *left,*right; Node():left(NULL),right(NULL){}};Node* nd[10005];vecto原创 2013-04-03 22:32:01 · 1718 阅读 · 0 评论 -
一点体会
昨天晚上做了微软校招的笔试题目,感觉自己的基础知识还是很不扎实,不能形成一个体系。思考问题的时候,要从自己的体系结构中来思考而不是完全靠直觉,直觉这种东西说有突然就有了,说没有怎么也来不了。很多不该错的题目都弄错了,这完全暴露了自己的基本功还不扎实,不能够运用自如。比如有一道题目求N!后零的个数,这是编程之美上的一道题目,自己虽然知道解法,但忘了具体的原理,感觉虽然看了编程之美好几遍了,还没有将这原创 2013-04-05 12:28:15 · 712 阅读 · 0 评论 -
两次二分查找
面试题:已知一个排序数组,从中查找某个数的出现次数,请问应该如何查找?答案:最快的方法是先查找该数字在数组中最左边出现的位置,然后查找该数字在数组中最右边出现的位置,两者只差即为所求,时间复杂度为logn。代码如下:#include#includeint bsearch_left(int arr[],int l,int r,int v){ int left=l,right原创 2013-03-24 16:50:46 · 920 阅读 · 0 评论 -
只用4行代码编写出一个从字符串到长整形的函数
int sum=0; for(int i=0;i<strlen(ch);i++) sum=(ch[i]>='0'&&ch[i]<='9'&&sum!=-1)?sum*10+ch[i]-'0':-1; return sum;原创 2013-03-21 17:08:22 · 2906 阅读 · 1 评论 -
剑指offer 调整数组的顺序使奇数位于偶数前面
我做这道题目是参考算法导论中快排中对数组划分来做的,令:书中是使用两个指针来做的。void f(int a[],int n){ int p=-1; for(int i=0;i<n;i++) if(a[i]%2==1){ p++; int tmp=a[p]; a[p]=a[i]; a[i]=tmp; }原创 2013-03-27 16:49:35 · 854 阅读 · 0 评论 -
百度笔试题合并a[0..mid]和a[mid+1,n-1],其中这两个数组分别有序
我的想法是使用两个指针i和j分别指向两段数组的开头,如果a[i]a[j-1]向后平移一个位置,然后将tmp赋值到i这个位置void merge(int a[],int mid,int n){ int i,j; i=0,j=mid; while(i<n&&j<n&&i<j){ if(a[i]<a[j]) i++; else{ int tmp原创 2013-04-12 19:46:25 · 1246 阅读 · 0 评论 -
腾讯几道题
转载来自:http://bbs.csdn.net/topics/390424969第一题:signed char a=0xe0;unsigned int b=a;unsigned char c=a;下面说法正确的是:A (a>0 )&&(b>0)为真 B c==a 为真 C b的16进制为0xffffffe0 D 都不对[cpp]原创 2013-04-19 22:58:30 · 609 阅读 · 0 评论 -
求最小的K个数
这样的题目写过很多,我这次要说明的是,一定要按照自己的想法来写,不要死记书上的解法,那样的话,你并没有转化为自己的东西#include #include #include #include using namespace std;vector res;void swap(vector &v,int i,int j){ int tmp=v[i]; v[i]=v[j]; v原创 2013-09-26 14:37:26 · 652 阅读 · 0 评论