算法思路
在这道题中,关键在于如何利用空瓶数换汽水,并且考虑到特殊规则:剩下2个空瓶时可以借瓶子换1瓶汽水。我们可以用以下思路来求解:
- 基本规则:每3个空瓶可以换1瓶汽水。
- 特殊规则:当剩下2个空瓶时,可以借1个空瓶,凑成3个空瓶继续换1瓶汽水。喝完之后手里没有空瓶。
- 换汽水的核心思想:每2个空瓶都能换1瓶汽水。因此,求解过程就是直接把空瓶数除以2来得到最大可以喝到的汽水瓶数。
Code
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 主函数
void async function () {
let line; // 存储每次输入的空瓶数量
while (true) {
line = await readline(); // 读取每行输入
if (line === '0') break; // 如果输入为 0,结束输入并退出
if (line !== '0') {
// 直接输出空瓶数除以2的结果
console.log(Math.floor(parseInt(line) / 2));
}
}
}();
复杂度分析
- 时间复杂度:由于每次输入只进行一次整数除法运算,时间复杂度为
O(1)
。 - 空间复杂度:程序只使用了常数级别的空间,空间复杂度为
O(1)
。