当前位置: 面试刷题>> 二进制手表 (经典算法题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 ```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 ```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 ```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示例中通过`+`操作符将小时和分钟转换成了统一的十进制表示来处理)。
推荐面试题