校招算法笔面试 | 校招笔面试真题-扭蛋机

题目

题目链接

解题思路

这是一个贪心算法问题。关键点如下:

  1. 扭蛋机2号:投入 x x x 个扭蛋,可以得到 2 x + 1 2x+1 2x+1
  2. 扭蛋机3号:投入 x x x 个扭蛋,可以得到 2 x + 2 2x+2 2x+2
  3. 需要通过两人轮流使用扭蛋机,最终得到 N N N 个扭蛋

解题思路:

  1. 从目标数N开始反向推导
  2. 每次判断 N N N 的奇偶性:
    • 如果 N N N 是偶数,使用3号机器,因为 ( n − 2 ) / 2 (n-2)/2 (n2)/2 是整数
    • 如果 N N N 是奇数,使用2号机器,因为 ( n − 1 ) / 2 (n-1)/2 (n1)/2 是整数
  3. 每次操作后,更新 N N N 为投入的扭蛋数量
  4. 重复直到 N = 0 N=0 N=0,记录使用的机器顺序

代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    string result;
    while (n > 0) {
        if (n % 2 == 0) {
            n = (n - 2) / 2;
            result += '3';
        } else {
            n = (n - 1) / 2;
            result += '2';
        }
    }
    
    reverse(result.begin(), result.end());
    cout << result << endl;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        StringBuffer str = new StringBuffer();
        while (n > 0) {
            if (n % 2 == 0) {
                n = (n - 2) / 2;
                str.append("3");
            } else {
                n = (n - 1) / 2;
                str.append("2");
            }
        }
        
        str.reverse();
        System.out.println(str);
    }
}
n = int(input())
result = []

while n > 0:
    if n % 2 == 0:
        n = (n - 2) // 2
        result.append('3')
    else:
        n = (n - 1) // 2
        result.append('2')

print(''.join(result[::-1]))

算法及复杂度

  • 算法:贪心
  • 时间复杂度: O ( log ⁡ n ) \mathcal{O}(\log n) O(logn) - 每次操作将 n n n 减半
  • 空间复杂度: O ( log ⁡ n ) \mathcal{O}(\log n) O(logn) - 需要存储结果字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值