牛客-其他公司的笔试汇总-长期更新

前言:如果题目做了不会或通过率低就那么过了,感觉还是有点遗憾,记录又不费时,日后闲暇时思索也是一种乐趣。

走台阶-某度

题目描述:
牛牛回家要走恰好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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值