面试题
qq675927952
在上学中
展开
-
二元查找树转变成排序的双向链表
<br />输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。<br />要求不能创建任何新的结点,只调整指针的指向。<br />#include <iostream>#include <stack>using namespace std;struct node{ node* lchild; node* rchild; int data; node(int v) { lchild = rchild =NULL; data = v;原创 2011-04-17 16:15:00 · 524 阅读 · 0 评论 -
概率生成器
扩展解法:已 知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造1、 2、3的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低。 只要产生的串中,0和1的个数相等,则为些串的概率就相等。PS:C(2x,x)的意思是生成2x位的二进制数,其中原创 2012-05-06 11:07:14 · 770 阅读 · 0 评论 -
后缀数组
1. 概述后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。本文大部分内容摘自参考资料[1][2]。2. 后缀数组2.1 几个概念(1)后缀数组SA 是一个一维数组,它保存1..n 的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA[i]) (2)名次数组转载 2011-12-28 16:41:20 · 980 阅读 · 0 评论 -
最小正序列和
#include #include using namespace std;//最小正子序列和(minimun subsequences sum)const int MAXINT=999999;struct Node{ int sum; int xia原创 2011-09-19 16:55:09 · 1708 阅读 · 1 评论 -
几道面试题
/*在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,一个解答:这需要两次遍历,然后再遍历一次原数组,将所有data[i]>=a[i-1]&&data[i]给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。则只要在上述思想上进行改进一原创 2011-06-28 15:55:00 · 626 阅读 · 0 评论 -
构造一个队列,使front,push,getMaxElement都是O(1)时间
<br />#include <iostream>using namespace std;const int MAXLEN = 50;const int INF = 99999999;/*构造一个队列,使front,push,getMaxElement都是O(1)时间思路:由于更新大小关系要考虑到后面的元素,如 1(1) 2(2) 此时来了个 3,则前面的最大元素都要改,所以 用栈来保存元素间的大小关系比较合适*/class stack{private:原创 2011-04-24 21:15:00 · 880 阅读 · 0 评论 -
根据上排给出十个数,在其下排填出对应的十个数
<br />#include <iostream>using namespace std;int judge(int arrGiven[],int arrDest[],int len){ int flag = 0; while(!flag) { //统计第一行的元素 在第二行里出现的次数 for(int i=0;i<len;i++) { int cnt = 0; for(int j=0;j<len;j+原创 2011-04-18 14:03:00 · 709 阅读 · 0 评论 -
整数分解,输出所有分解方案
如,对于正整数n=6,可以拆分为:65+14+2, 4+1+13+3, 3+2+1, 3+1+1+12+2+2, 2+2+1+1, 2+1+1+1+11+1+1+1+1+1+1现在的问题是,对于给定的正整数n,程序输出该整数的拆分种类数(HDOJ 1028)。DP思路:n = n1 + n2 + n3 + n4 + .... + nk状态表示:将n划分为k原创 2011-04-25 16:30:00 · 1311 阅读 · 0 评论