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