Codewars骰子统一面最小旋转次数代码优化求助
解决方案
首先明确核心规则:
- 当前面与目标面一致:0次旋转
- 当前面是目标面的对立面:2次旋转
- 其他情况:1次旋转
你之前只选出现次数最多的面作为目标,忽略了一种情况:某些出现次数较少的面,加上所有骰子转到它的总旋转成本,反而比选出现次数最多的面更低。比如骰子数组[1,1,6,2,2],选1的总旋转次数是4,选2的总旋转次数是3,后者更优。
正确的思路是遍历所有6个可能的目标面,计算每个目标面对应的总旋转次数,最后取最小值。
修改后的JavaScript代码
function minRotations(dice) { // 定义对立面映射 const opposites = {1:6, 6:1, 2:5, 5:2, 3:4, 4:3}; let minTotal = Infinity; // 遍历所有6个可能的目标面 for (let target = 1; target <= 6; target++) { let total = 0; for (let face of dice) { if (face === target) { total += 0; } else if (face === opposites[target]) { total += 2; } else { total += 1; } } // 更新最小总次数 if (total < minTotal) { minTotal = total; } } return minTotal; }
代码说明
- 用对象
opposites存储每个面的对立面,方便快速查询 - 初始化最小总次数为无穷大,确保第一次计算的总次数能覆盖它
- 循环遍历1到6的所有面作为目标,逐个计算总旋转成本
- 每次计算完一个目标面的成本后,和当前最小值比较,保留更小的数值
- 最终返回最小的总旋转次数
内容的提问来源于stack exchange,提问作者Wojtek1911
相关产品推荐
相关产品推荐

