# 二进制手表

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:

输入:turnedOn = 9
输出:[]
1
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

枚举的方法就不写代码了,直接写下思路

1、枚举10位2进制所有的情况,计算1的个数,然后与turnedOn匹配

更新时间: 5/5/2023, 11:19:52 AM