算法思路

在这道题中,关键在于如何利用空瓶数换汽水,并且考虑到特殊规则:剩下2个空瓶时可以借瓶子换1瓶汽水。我们可以用以下思路来求解:

  1. 基本规则:每3个空瓶可以换1瓶汽水。
  2. 特殊规则:当剩下2个空瓶时,可以借1个空瓶,凑成3个空瓶继续换1瓶汽水。喝完之后手里没有空瓶。
  3. 换汽水的核心思想:每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)