前言:如果题目做了不会或通过率低就那么过了,感觉还是有点遗憾,记录又不费时,日后闲暇时思索也是一种乐趣。
其他公司笔试题
走台阶-某度
题目描述:
牛牛回家要走恰好n个台阶,
由于牛牛步伐不大,故单步最多只能跨越最多m个台阶,最少跨一个台阶。
牛牛有一个奇怪的习惯,他要求每步和之前两步走的台阶数目不能相同。
牛牛想知道有多少种不同的走法,答案对10的9次方+7取模。
输入描述:
一行输入两个整数n、m,表示台阶数目,单步跨越的最多台阶数目。
对于30%的数据有m<=n<=5。
对于60%的数据有n<=300。
对于100%的数据有1<=n<=100000,2<=m<=7。
输出描述:
一行一个整数,表示答案。
示例:
输入:7 3
输出:2
说明:仅[1,2,3,1],[1,3,2,1]两种
注:下面是代码。思路是dfs加剪支或预剪枝,但都存在递归太深导致栈溢出的问题,如n过万,递归都不行。
百度笔试:回家有n个台阶,每次至少走一个,但是要求每步和之前两步走的台阶数目不能一样
import java.util.*;
public class Main {
public static long total;
final static int mod = 1000000007;
// 太过累赘
public static void climb(int step, int left, String cur) {
// 剪枝
if ((left < 0)) // 保证恰好走完台阶
return;
int len = cur.length();
// 后续方法不需要这么麻烦剪枝
if (len >= 2) {
if (cur.charAt(len - 1) == cur.charAt(len - 2)) // 保证最后一级台阶与前一台阶不同
return;
if (len >= 3 && cur.charAt(len - 1) == cur.charAt(len - 3)) // 保证最后一级台阶与前两次跨越不同
return;
}
if (left == 0) {
total = (total + 1) % mod;
//System.out.println(cur);
return;
}
for (int i = 1; i <= step; i++) {
climb(step, left - i, cur + i);
}
}
// 保存了前两步结点的递归
public static int res = 0;
public static void dfs(int index,