题目描述
二进制手表顶部有 4
个 LED 代表 小时(0-11),底部的 6
个 LED 代表 分钟(0-59)。
每个 LED 代表一个 0
或 1
,最低位在右侧。
例如,上面的二进制手表读取 3:25
。
给定一个非负整数 n
代表当前 LED 亮着的数量,返回所有可能的时间。
样例
输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
限制
- 输出的顺序没有要求。
- 小时不会以零开头,比如
01:00
是不允许的,应为1:00
。 - 分钟必须由两位数组成,可能会以零开头,比如
10:2
是无效的,应为10:02
。 - 超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现
13:00
、0:61
等时间。
算法1
(暴力枚举) $O(12 \times 60)$
- 枚举所有可能的时间点,判断小时和分钟各用了多少个 LED。
时间复杂度
- 最多有 $12 \times 60$ 个时刻,每次判断仅需要常数的时间,故总时间复杂度为 $O(12 \times 60)$。
空间复杂度
- 需要 $O(12 \times 60)$ 的额外空间存储答案。
Go 代码
func readBinaryWatch(num int) []string {
ans := make([]string, 0)
for h := 0; h < 12; h++ {
for m := 0; m < 60; m++ {
cnt := 0
for i := 0; i < 4; i++ {
if ((h >> i) & 1) == 1 {
cnt++
}
}
for i := 0; i < 6; i++ {
if ((m >> i) & 1) == 1 {
cnt++
}
}
if cnt == num {
ans = append(ans, fmt.Sprintf("%d:%02d", h, m))
}
}
}
return ans
}
大佬,这是换go代码写了吗
一般复杂的算法会用 c++ 写,其实也看哪个语言写起来顺手 hh