1. 问题

  • 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,
  • 拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。
    • 例如: [4,2,1] => 4
    • [2,3,10] => 8
  • 思路也很简单
    • 当某堆硬币数coin是偶数时,拿取次数最少为coin/2次;
    • 当某堆硬币数coin是奇数时,拿取次数最少为coin/2 + 1次;
1
2
3
4
if(coin % 2 == 0) 
count = coin / 2;
else
count = coin / 2 + 1;

2. 解决方法

2.1 reduce

1
2
3
const coins =  [2,3,10];
coins[0] = Math.ceil(coins[0]/2)
coins.reduce((p, c) => p + Math.ceil(c / 2))

2.2 位运算

1
2
3
4
5
6
7
const coins = [2,3,10]
let count = 0;
for(let item of coins){
// item/2并向上取整 + 如果是奇数要+1否则+0
count+=(item >> 1) + (item & 1)
}
console.log(count) // 8

3. 题源