- 两个线程分别打印26个英文字母的元音(a, e, i, o, u)和辅音(其他),按字母序输出。
- 一条N个格子组成的直线道路,每次可以前进1格或2格;设计算法计算有多少种方式走到终点?
- 实现一个能够生产不同类型手机(Android、iPhone)的工厂,考虑未来可能的扩展
第一题并发相关。
第二题算法相关:斐波那契数列。
第一步:找出规律
public class Solution {
public int JumpFloor(int target) {
if(target<=0)
{
return -1;
}else if(target==1)
{
return 1;
}else if(target==2)
{
return 2;
}else
{
return JumpFloor(target-1)+JumpFloor(target-2);
}
}
}
上述递归代码之所以慢,是因为重复的计算太多,我们只要想办法避免重复的计算就可以。比如我们可以把已经得到的数列中间项保存起来,在下次需要计算的时候我们先排查一下,如果已经计算过就不用再重复计算了。这样的时间复杂度是O(n)。
public class Solution {
public int JumpFloor(int target) {
int[] result = {0, 1, 2};
if(target < 3){
return result[target];
}
int one = 1;
int two = 2;
int results = 0;
for(int i =2; i < target; i++){
results = one + two;
one = two;
two = results;
}
return results;
}
}