You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求职面试Hacker Rank算法题求助:最小服务器数量计算

解决方案:利用2的幂特性的贪心算法

这题的核心突破口是所有服务器容量都是2的幂——这个特性让贪心算法成为最优解:更大的2的幂无法被更小的同类组合替代,而且使用更大的服务器能直接减少总数量(比如8的容量等于4+2+2,但只用1台,比3台少)。

解决步骤

  • 先统计每种容量的服务器有多少台,方便后续快速查询可用数量
  • 将所有不同的容量按从大到小排序,优先使用大服务器以最小化数量
  • 遍历排序后的容量,计算当前容量最多能使用的台数,累加数量并更新剩余负载
  • 最后检查剩余负载是否为0,返回对应结果

JavaScript 实现代码

function getMinServers(expected_load, server_array) {
  // 统计各容量服务器的可用数量
  const serverCounts = {};
  for (const s of server_array) {
    serverCounts[s] = (serverCounts[s] || 0) + 1;
  }

  // 按容量从大到小排序
  const sortedServers = Object.keys(serverCounts)
    .map(Number)
    .sort((a, b) => b - a);

  let remainingLoad = expected_load;
  let minServers = 0;

  for (const capacity of sortedServers) {
    if (remainingLoad <= 0) break;
    
    // 计算当前容量最多能使用的台数:不超过剩余负载需求,也不超过可用数量
    const maxNeeded = Math.floor(remainingLoad / capacity);
    const useCount = Math.min(maxNeeded, serverCounts[capacity]);
    
    if (useCount > 0) {
      minServers += useCount;
      remainingLoad -= useCount * capacity;
    }
  }

  return remainingLoad === 0 ? minServers : -1;
}

// 测试示例
console.log(getMinServers(10, [1, 2, 4, 8, 16])); // 输出 2(8 + 2)
console.log(getMinServers(3, [1, 1, 2])); // 输出 2(2 + 1)
console.log(getMinServers(5, [2, 2, 2])); // 输出 -1(无法凑出5)

对你原有代码的分析

你之前的嵌套循环只考虑了两台服务器组合的情况,但题目允许任意数量的服务器组合,这种思路会漏掉很多可能的解。而且没有利用2的幂的特性,不仅效率低(O(n²)时间复杂度),也无法保证找到最少数量的解。

内容的提问来源于stack exchange,提问作者Rawle Becerril

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:10:18