i=l;
}
}
第6题
腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值:
0,1,2,3,4,5,6,7,8,9
分配:
6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..
ANSWER:
Idon’tlikebrainteasers.Willskipmostofthem...
第7题
微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?
ANSWER:
structNode{
intdata;
intNode*next;
};
//ifthereisnocycle.
intisJoinedSimple(Node*h1,Node*h2){
while(h1->next!
=NULL){
h1=h1->next;
}
while(h2->next!
=NULL){
h2=h2->next;
}
returnh1==h2;
}
//iftherecouldexistcycle
intisJoined(Node*h1,Node*h2){
Node*cylic1=testCylic(h1);
Node*cylic2=testCylic(h2);
if(cylic1+cylic2==0)returnisJoinedSimple(h1,h2);
if(cylic1==0&&cylic2!
=0||cylic1!
=0&&cylic2==0)return0;
Node*p=cylic1;
while
(1){
if(p==cylic2||p->next==cylic2)return1;
p=p->next->next;
cylic1=cylic1->next;
if(p==cylic1)return0;
}
}
Node*testCylic(Node*h1){
Node*p1=h1,*p2=h1;
while(p2!
=NULL&&p2->next!
=NULL){
p1=p1->next;
p2=p2->next->next;
if(p1==p2){
returnp1;
}
}
returnNULL;
}
第8题
此贴选一些比较怪的题,,由于其中题目本身与算法关系不大,仅考考思维。
特此并作一题。
1.有两个房间,一间房里有三盏灯,另一间房有控制着三盏灯的三个开关,
这两个房间是分割开的,从一间里不能看到另一间的情况。
现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。
有什么办法呢?
ANSWER:
Skip.
2.你让一些人为你工作了七天,你要用一根金条作为报酬。
金条被分成七小块,每天给出一
块。
如果你只能将金条切割两次,你怎样分给这些工人?
ANSWER:
1+2+4;
3.★用一种算法来颠倒一个链接表的顺序。
现在在不用递归式的情况下做一遍。
ANSWER:
Node*reverse(Node*head){
if(head==NULL)returnhead;
if(head->next==NULL)returnhead;
Node*ph=reverse(head->next);
head->next->next=head;
head->next=NULL;
returnph;
}
Node*reverseNonrecurisve(Node*head){
if(head==NULL)returnhead;
Node*p=head;
Node*previous=NULL;
while(p->next!
=NULL){
p->next=previous;
previous=p;
p=p->next;
}
p->next=previous;
returnp;
}
★用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。
ANSWER:
Idon’tunderstandwhatis“Chuanyue”.
★用一种算法整理一个数组。
你为什么选择这种方法?
ANSWER:
Whatis“Zhengli?
”
★用一种算法使通用字符串相匹配。
ANSWER:
Whatis“Tongyongzifuchuan”...astringwith“*”and“?
”?
Ifso,hereisthecode.
intmatch(char*str,char*ptn){
if(*ptn==‘\0’)return1;
if(*ptn==‘*’){
do{
if(match(str++,ptn+1))return1;
}while(*str!
=‘\0’);
return0;
}
if(*str==‘\0’)return0;
if(*str==*ptn||*ptn==‘?
’){
returnmatch(str+1,ptn+1);
}
return0;
}
★颠倒一个字符串。
优化速度。
优化空间。
voidreverse(char*str){
reverseFixlen(str,strlen(str));
}
voidreverseFixlen(char*str,intn){
char*p=str+n-1;
while(str
charc=*str;
*str=*p;*p=c;
}
}
★颠倒一个句子中的词的顺序,比如将“我叫克丽丝”转换为“克丽丝叫我”,
实现速度最快,移动最少。
ANSWER:
Reversethewholestring,thenreverseeachword.UsingthereverseFixlen()above.
voidreverseWordsInSentence(char*sen){
intlen=strlen(sen);
reverseFixlen(sen,len);
char*p=str;
while(*p!
=’\0’){
while(*p==‘‘&&*p!
=’\0’)p++;
str=p;
while(p!
=‘‘&&*p!
=’\0’)p++;
reverseFixlen(str,p-str);
}
}
★找到一个子字符串。
优化速度。
优化空间。
ANSWER:
KMP?
BM?
Sunday?
UsingBMorsunday,ifit’sASCIIstring,thenit’seasytofastaccesstheauxiliaryarray.Otherwiseanhashmaporbstmaybeneeded.Letsassumeit’sanASCIIstring.
intbm_strstr(char*str,char*sub){
intlen=strlen(sub);
inti;
intaux[256];
memset(aux,sizeof(int),256,len+1);
for(i=0;i aux[sub[i]]=len-i;
}
intn=strlen(str);
i=len-1;
while(i intj=i,k=len-1;
while(k>=0&&str[j--]==sub[k--])
;
if(k<0)returnj+1;
if(i+1 i+=aux[str[i+1]];
else
return-1;
}
}
However,thisalgorithm,aswellasBM,KMPalgorithmsuseO(|sub|)space.Ifthisisnotacceptable,Rabin-carpalgorithmcandoit.Usinghashingtofastfilteroutmostfalsematchings.
#defineHBASE127
intrc_strstr(char*str,char*sub){
intdest=0;
char*p=sub;
intlen=0;
intTO_REDUCE=1;
while(*p!
=’\0’){
dest=HBASE*dest+(int)(*p);
TO_REDUCE*=HBASE;
len++;
}
inthash=0;
p=str;
inti=0;
while(*p!
=‘\0’){
if(i++ elsehash=(hash-(TO_REDUCE*(int)(*(p-len))))*HBASE+(int)(*p);
if(hash==dest&&i>=len&&strncmp(sub,p-len+1,len)==0)returni-len;
p++;
}
return-1;
}
★比较两个字符串,用O(n)时间和恒量空间。
ANSWER:
Whatis“comparingtwostrings”?
Justnormalstringcomparison?
ThenaturalwayuseO(n)timeandO
(1)space.
intstrcmp(char*p1,char*p2){
while(*p1!
=‘\0’&&*p2!
=‘\0’&&*p1==*p2){
p1++,p2++;
}
if(*p1==‘\0’&&*p2==‘\0’)return0;
if(*p1==‘\0’)return-1;
if(*p2==‘\0’)return1;
return(*