# 二进制手表
401. 二进制手表 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。 分钟必须由两位数组成,可能会以零开头:
例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。
示例 1:
输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
1
2
2
示例 2:
输入:turnedOn = 9
输出:[]
1
2
2
/**
* @param {number} turnedOn
* @return {string[]}
*/
var readBinaryWatch = function(turnedOn) {
// 1、最先想到是怎么将 turnedOn 个1进行排列组合 难度相较于2难一点
// 2、看了官方题解,才知道直接枚举所有结果,然后与 turnedOn 匹配
/**
prev :上一个值
nums:位数
oneNums:可分配1的数量
*/
const result = []
function backTrace(prev,nums,oneNums){
// 1的数量太多或者太少
if(10-nums<oneNums||oneNums<0) return
// 没有1可以分配了
if(oneNums===0) {
prev = prev<<(10-nums)
let time = transTime(prev)
if(time) result.push(time)
return
}
// 选择与不选择两条路
backTrace(prev*2,nums+1,oneNums)
backTrace(prev*2+1,nums+1,oneNums-1)
}
function transTime(num){
let h = num>>6
let m = num&63
if(h>11) return
if(m>59) return
return h +':'+ (m>=10?m:`0${m}`)
}
backTrace(0,0,turnedOn)
return result
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
枚举的方法就不写代码了,直接写下思路
1、枚举10位2进制所有的情况,计算1的个数,然后与turnedOn匹配