递归+记忆化—宇信科技(北京)笔试算法题(一)

题目:小明手中有个数字n,他有两种方法操作n。

第一种,使n-1,然后步数+x。

第二种,使n/k(满足n%k=0),然后步数+y。

给定一个数组,求出将n变成1最少需要多少步。

import java.util.HashMap;
import java.util.Map;

public class MinStepsToReduceNumber {

    private Map<Long, Integer> memo = new HashMap<>();

    public int minSteps(long n, int k, int x, int y) {
        // 如果n已经是1,则不需要额外的步骤
        if (n == 1) return 0;
        // 如果之前已经计算过当前n对应的最小步数,则直接返回结果
        if (memo.containsKey(n)) return memo.get(n);

        // 计算减1操作后的步数
        int result = x + minSteps(n - 1, k, x, y);
        
        // 如果n可以被k整除,则考虑除以k的操作
        if (n % k == 0) {
            // 计算除以k操作后的步数
            int divideResult = y + minSteps(n / k, k, x, y);
            // 取两者中的较小值
            result = Math.min(result, divideResult);
        }

        // 将计算结果存入map中
        memo.put(n, result);
        return result;
    }

    public static void main(String[] args) {
        MinStepsToReduceNumber solver = new MinStepsToReduceNumber();
        long n = 10; // 示例数字n
        int k = 2;   // 示例k值
        int x = 1;   // 减1操作的代价
        int y = 3;   // 除以k操作的代价

        System.out.println("最少需要的步数是:" + solver.minSteps(n, k, x, y));
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇