1、斐波那契數(shù)列的各種算法實現(xiàn)(百度)
答:
(1)、采用遞歸實現(xiàn)
long fibonacci(int n)
{
if (n == 0)
return 0;
else if (n == 1)
return 1;
else if (n > 1)
return fibonacci (n - 1) + fibonacci (n - 2);
else
return -1;
}
(2)衰琐、數(shù)組遍歷實現(xiàn)(效率更高)
long fibonacci(int n)
{
long[] * temp = new long[n + 1];
temp[0] = 0;
if (n > 0)
temp[1] = 1;
for(int i = 2; i <= n; ++i)
{
temp[i] = temp[i - 1] + temp[i - 2];
}
long result = temp[n];
return result;
}
2也糊、過橋時間問題(阿里UC)
一盞燈只能亮30秒,每次可兩人過橋.五個人過橋的時間分別是1秒、3秒羡宙、6秒狸剃、8秒、12秒.兩人過橋后應有一人將燈帶回原岸,然后才能繼續(xù)過橋.兩人一起過橋時間以長的一位計算.試求出最短時間并證明其是最短時間.
答:
以過橋時間來代表過橋的人
1和3過橋1回3留下 耗時3+1=4秒
8和12過橋3回8和12留下 耗時12+3=15秒
1和6過橋1回6留下 耗時6+1=7秒
1和3過橋 耗時3秒
共耗時29秒
2狗热、天平稱重問題(騰訊)
有1000個零件,其中有1個是次品(質量輕).用天平稱,至少稱幾次一定能找出這個次品呢?
答:
第1次:333钞馁、333、334
333匿刮、333稱重,若平則334里有次品,因為334數(shù)目多最難,所以假設334里有僧凰;
第2次:111、111熟丸、112,同上,假設112里有训措;
第3次:37、37光羞、38,假設38里有
第4次:13绩鸣、13、12纱兑、因為13數(shù)目多,要假設13里有次品
第5次:4呀闻、4、5潜慎、假設5里有
第6次:2捡多、2、1铐炫、假設2里有
第7次:1垒手、1 確定
3、問題描述:將兩個已經排序的單向鏈表合并為一個鏈表驳遵,要求空間復雜度盡可能的小淫奔。(騰訊)
本題兩個注意事項:
第一,任何題目都有時間和空間的要求堤结,所以不要想當然地重建一個鏈表唆迁,這樣會帶來空間的浪費
第二,該題可以用兩種方法來實現(xiàn)竞穷,遞歸和循環(huán)
具體代碼如下
(1)遞歸方法:
class Node
{
int data;
Node next;
};
Node mergeList(Node leftNode,Node rightNode)
{
if(leftNode==null)
{
return rightNode;
}
if(rightNode==null)
{
return leftNode;
}
Node next;
if(leftNode.data< rightNode.data)
{
next=mergeList(leftNode.next, rightNode);
leftNode.next=next;
return p1;
}else
{
next=mergeList(leftNode, rightNode.next);
rightNode.next=next;
return rightNode;
}
}
(2)循環(huán)解法:
class Node
{
int data;
Node *node;
};
Node mergeList(Node leftNode,Node rightNode)
{
if(leftNode==null)
{
return rightNode;
}
if(rightNode ==null)
{
return leftNode;
}
Node newHead,cur;
if(leftNode.data<rightNode.data)
{
newHead= leftNode;
leftNode = leftNode.next;
}else
{
newHead= rightNode;
rightNode = rightNode.next;
}
cur=newHead;
while(leftNode!=null && rightNode!=null)
{
if(leftNode.data< rightNode.data)
{
cur.next= leftNode;
leftNode = leftNode.next;
cur=cur.next;
}else
{
cur.next= rightNode;
rightNode = rightNode.next;
cur=cur.next;
}
}
cur.next= rightNode.next==null? leftNode:rightNode;
return newHead;
}