字节跳动青训营——入营考核解答(持续更新中~~~)

AI 加码,字节跳动青训营,等待您的加入~

1、报名方式

  1. 点击以下链接:字节跳动青训营报名入口
  2. 扫描图片二维码:在这里插入图片描述

2、考核内容

在指定的题库中自主选择不少于 15 道算法题并完成解题,其中题目难度分配如下:

  • 简单题不少于 10 道
  • 中等题不少于 4 道
  • 困难题不少于 1 道

解答代码

23. 不再贪心的小包(困难)

代码实现:


public class Main {
    private static int[] factorialCache;

    public static int solution(int n, int m, int s, int[] like) {
        // 初始化缓存数组
        factorialCache = new int[like[n - 1] + 1];
        return backtrack(0, 0, 0, n, m, s, like);
    }

    public static int backtrack(int index, int currentSum, int usedMagicSticks, int n, int m, int s, int[] like) {
        // 如果已经遍历完所有甜点
        if (index == n) {
            // 如果当前喜爱值之和等于预期值,返回 1 表示找到一种方案,否则返回 0
            return currentSum == s ? 1 : 0;
        }

        // 不使用魔法棒的情况
        int count = backtrack(index + 1, currentSum + like[index], usedMagicSticks, n, m, s, like);

        // 如果还有魔法棒可用
        if (usedMagicSticks < m) {
            // 使用魔法棒的情况
            int factorial = getFactorial(like[index]);
            // 这里是关键步骤,您需要思考如何正确地累加方案数
            count += backtrack(index + 1, currentSum + factorial * like[index], usedMagicSticks + 1, n, m, s, like);
        }

        return count;
    }

    public static int getFactorial(int num) {
        // 如果缓存中已经有值,则直接返回
        if (factorialCache[num] != 0) {
            return factorialCache[num];
        }
        // 0和1的阶乘是1
        if (num == 0 || num == 1) {
            factorialCache[num] = 1;
        } else {
            // 否则计算阶乘并缓存结果
            factorialCache[num] = num * getFactorial(num - 1);
        }
        return factorialCache[num];
    }

    public static void main(String[] args) {
        // You can add more test cases here
        int[] like1 = { 1, 2, 3 };
        int[] like2 = { 1, 1, 1 };

        System.out.println(solution(3, 2, 6, like1) == 2);
        System.out.println(solution(3, 1, 1, like2) == 0);
    }
}

运行结果在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值