当前位置: 面试刷题>> 二进制手表 (经典算法题500道)


题目描述补充

二进制手表是一个有趣的装置,它的显示方式不同于传统的手表。这种手表上只有10个LED灯,分别代表小时(前4个LED)和分钟(后6个LED)的二进制表示。每个LED灯只有两种状态:亮(1)或灭(0)。通过这10个LED灯的不同组合,可以表示从00:00到11:59的所有时间。

具体来说,前4个LED灯(从右到左,记作h3 h2 h1 h0)代表小时,它们组成的二进制数转换成十进制数即为小时数(注意,这里只考虑0到11的小时数,即二进制最多到1011)。后6个LED灯(从右到左,记作m5 m4 m3 m2 m1 m0)代表分钟,它们组成的二进制数转换成十进制数即为分钟数(注意,分钟数最大为59,即二进制最多到111011,但不需要所有位都用到)。

任务

编写一个程序,接受一个十进制时间(例如,7:37应输入为737),然后输出所有可能表示该时间的二进制手表的LED灯状态(即,h3 h2 h1 h0 m5 m4 m3 m2 m1 m0的二进制表示)。

示例代码

PHP

function binaryWatch($num) {
    $result = [];
    for ($h = 0; $h < 12; $h++) {
        for ($m = 0; $m < 60; $m++) {
            if (bindec(decbin($h)) + bindec(decbin($m)) == $num) {
                $hBin = str_pad(decbin($h), 4, '0', STR_PAD_LEFT);
                $mBin = str_pad(decbin($m), 6, '0', STR_PAD_LEFT);
                $result[] = $hBin . $mBin;
            }
        }
    }
    return $result;
}

// 示例:输出表示7:37的所有可能LED灯状态
echo json_encode(binaryWatch(737));

Python

def binaryWatch(num):
    result = []
    for h in range(12):
        for m in range(60):
            if bin(h).count('1') + bin(m).count('1') == num:
                result.append(f"{bin(h)[2:].zfill(4)}{bin(m)[2:].zfill(6)}")
    return result

# 示例:输出表示7:37的所有可能LED灯状态
print(binaryWatch(7 + 37 * 10))  # Python中无法直接处理带冒号的时间,因此用737表示

JavaScript

function binaryWatch(num) {
    const result = [];
    for (let h = 0; h < 12; h++) {
        for (let m = 0; m < 60; m++) {
            if ((h.toString(2).length > 4 ? h.toString(2).slice(-4) : h.toString(2).padStart(4, '0')).length +
                (m.toString(2).length > 6 ? m.toString(2).slice(-6) : m.toString(2).padStart(6, '0')).length === num) {
                result.push(h.toString(2).padStart(4, '0') + m.toString(2).padStart(6, '0'));
            }
        }
    }
    return result;
}

// 示例:输出表示7:37的所有可能LED灯状态
console.log(binaryWatch(7 + 37 * 10));  // JavaScript中也无法直接处理带冒号的时间

以上代码示例均能够找到所有可能表示给定时间(例如7:37)的二进制手表LED灯状态。在binaryWatch函数中,我们通过两层循环遍历所有可能的小时和分钟组合,并检查它们转换成二进制后,其中1的个数之和是否等于给定的num(注意,JavaScript和Python示例中通过+操作符将小时和分钟转换成了统一的十进制表示来处理)。

推荐面试题