1、斐波那契数列的各种算法实现(百度)
答:
(1)、采用递归实现
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)、数组遍历实现(效率更高)
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秒.两人过桥后应有一人将灯带回原岸,然后才能继续过桥.两人一起过桥时间以长的一位计算.试求出最短时间并证明其是最短时间.
答:
以过桥时间来代表过桥的人
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数目多最难,所以假设334里有;
第2次:111、111、112,同上,假设112里有;
第3次:37、37、38,假设38里有
第4次:13、13、12、因为13数目多,要假设13里有次品
第5次:4、4、5、假设5里有
第6次:2、2、1、假设2里有
第7次:1、1 确定
3、问题描述:将两个已经排序的单向链表合并为一个链表,要求空间复杂度尽可能的小。(腾讯)
本题两个注意事项:
第一,任何题目都有时间和空间的要求,所以不要想当然地重建一个链表,这样会带来空间的浪费
第二,该题可以用两种方法来实现,递归和循环
具体代码如下
(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)循环解法:
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;
}