题很简单,逆序地打印斐波那契数列。
第一个想到的思路是,循环地得到数列的每个值,存在一个容器里(比如stack),然后逆序一一输出即可。
但面试官要求空间复杂度O(1)的话,就不能用额外的空间。
首先想到的就是递归地输出:
public static void reverseFibo(int n) {
if (n == 0) {
System.out.println(0);
return;
}
int fibo0 = 0;
int fibo1 = 1;
for (int i = 0; i < n; i++) {
int next = fibo0 + fibo1;
fibo0 = fibo1;
fibo1 = next;
}
System.out.print(fibo1 + " ");
reverseFibo(n - 1);
}
但是这个方法显然有太多的重复计算。考虑加上一个cache,把之前递归计算过的结果先存起来:
public static void reverseFibo(int n, int[] cache) {
if (n == 0) {
System.out.println(0);
return;
}
if(cache[n] != 0) {
System.out.print(cache[n] + " ");
} else {
int fibo0 = 0;
int fibo1 = 1;
for (int i = 0; i < n; i++) {
cache[i] = fibo1;
int next = fibo0 + fibo1;
fibo0 = fibo1;
fibo1 = next;
}
System.out.print(fibo1 + " ");
}
reverseFibo(n - 1, cache);
}