题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
讲真 个人感觉这道题难度不止中等 可以定义为较难 解法很巧妙 完整代码如下:
while (n = readline()) {
//定义重量类型数组并且通过map()方法将数组内元素转换为Number类型
let weight = readline().split(' ').map(Number);
//定义数量数组并且通过map()方法将数组内元素转换为Number类型
let num = readline().split(' ').map(Number);
//新建count Object用来统计后面总共可以称多少种不同的重量
let count = {0: true};
// 第一重循环————遍历weight数组
for (let i = 0; i < weight.length; i++) {
// 从count中取keys组成数组并且将数组内元素转换为Number类型(该数组元素会随着遍历实时更新)
let current = Object.keys(count).map(Number);
// 第二重循环————遍历num数组
for (let j = 1; j <= num[i]; j++) {
//第三重循环———遍历实时更新的current数组内元素
current.forEach(item => {
let val = item + j * weight[i];
count[val] = true;
})
}
}
//输出最终count长度,即可称重量的可能性总数
console.log(Object.keys(count).length);
}
补充:这里面最关键的是“0”的妙用,该答案也是查找其他朋友的答案,如果让我来想,是打破脑袋可能也想不出,正因为理解了
之后觉得太妙了,所以分享出来,写完之后还有些意犹未尽。
查看14道真题和解析