mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-31 16:14:39 +08:00
138 lines
4.1 KiB
Markdown
Executable File
138 lines
4.1 KiB
Markdown
Executable File
# [401. Binary Watch](https://leetcode.com/problems/binary-watch/)
|
||
|
||
|
||
## 题目
|
||
|
||
A binary watch has 4 LEDs on the top which represent the **hours** (**0-11**), and the 6 LEDs on the bottom represent the **minutes** (**0-59**).
|
||
|
||
Each LED represents a zero or one, with the least significant bit on the right.
|
||
|
||

|
||
|
||
For example, the above binary watch reads "3:25".
|
||
|
||
Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.
|
||
|
||
**Example**:
|
||
|
||
Input: n = 1
|
||
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
|
||
|
||
**Note**:
|
||
|
||
- The order of output does not matter.
|
||
- The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".
|
||
- The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02".
|
||
|
||
|
||
## 题目大意
|
||
|
||
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
|
||
|
||
给定一个非负整数 n 代表当前 LED 亮着的数量,返回二进制表所有可能的时间。
|
||
|
||
|
||
## 解题思路
|
||
|
||
|
||
- 给出数字 n,要求输出二进制表中所有可能的时间
|
||
- 题目中比较坑的是,分钟大于 60 的都不应该打印出来,小时大于 12 的也不应该打印出来,因为是非法的。给出的 num 大于 8 的也是非法值,最终结果应该输出空字符串数组。
|
||
- 这道题的数据量不大,可以直接用打表法,具体打表函数见 `findReadBinaryWatchMinute()` 和 `findReadBinaryWatchHour()` 这两个函数。
|
||
|
||
|
||
## 代码
|
||
|
||
```go
|
||
|
||
package leetcode
|
||
|
||
import (
|
||
"fmt"
|
||
"strconv"
|
||
)
|
||
|
||
var (
|
||
hour = []string{"1", "2", "4", "8"}
|
||
minute = []string{"01", "02", "04", "08", "16", "32"}
|
||
hourMap = map[int][]string{
|
||
0: []string{"0"},
|
||
1: []string{"1", "2", "4", "8"},
|
||
2: []string{"3", "5", "9", "6", "10"},
|
||
3: []string{"7", "11"},
|
||
}
|
||
minuteMap = map[int][]string{
|
||
0: []string{"00"},
|
||
1: []string{"01", "02", "04", "08", "16", "32"},
|
||
2: []string{"03", "05", "09", "17", "33", "06", "10", "18", "34", "12", "20", "36", "24", "40", "48"},
|
||
3: []string{"07", "11", "19", "35", "13", "21", "37", "25", "41", "49", "14", "22", "38", "26", "42", "50", "28", "44", "52", "56"},
|
||
4: []string{"15", "23", "39", "27", "43", "51", "29", "45", "53", "57", "30", "46", "54", "58"},
|
||
5: []string{"31", "47", "55", "59"},
|
||
}
|
||
)
|
||
|
||
func readBinaryWatch(num int) []string {
|
||
if num > 8 {
|
||
return []string{}
|
||
}
|
||
res := []string{}
|
||
for i := 0; i <= num; i++ {
|
||
for j := 0; j < len(hourMap[i]); j++ {
|
||
for k := 0; k < len(minuteMap[num-i]); k++ {
|
||
res = append(res, hourMap[i][j]+":"+minuteMap[num-i][k])
|
||
}
|
||
}
|
||
}
|
||
return res
|
||
}
|
||
|
||
/// ---------------------------------------
|
||
/// ---------------------------------------
|
||
/// ---------------------------------------
|
||
/// ---------------------------------------
|
||
/// ---------------------------------------
|
||
// 以下是打表用到的函数
|
||
// 调用 findReadBinaryWatchMinute(num, 0, c, &res) 打表
|
||
func findReadBinaryWatchMinute(target, index int, c []int, res *[]string) {
|
||
if target == 0 {
|
||
str, tmp := "", 0
|
||
for i := 0; i < len(c); i++ {
|
||
t, _ := strconv.Atoi(minute[c[i]])
|
||
tmp += t
|
||
}
|
||
if tmp < 10 {
|
||
str = "0" + strconv.Itoa(tmp)
|
||
} else {
|
||
str = strconv.Itoa(tmp)
|
||
}
|
||
// fmt.Printf("找到解了 c = %v str = %v\n", c, str)
|
||
fmt.Printf("\"%v\", ", str)
|
||
return
|
||
}
|
||
for i := index; i < 6; i++ {
|
||
c = append(c, i)
|
||
findReadBinaryWatchMinute(target-1, i+1, c, res)
|
||
c = c[:len(c)-1]
|
||
}
|
||
}
|
||
|
||
// 调用 findReadBinaryWatchHour(num, 0, c, &res) 打表
|
||
func findReadBinaryWatchHour(target, index int, c []int, res *[]string) {
|
||
if target == 0 {
|
||
str, tmp := "", 0
|
||
for i := 0; i < len(c); i++ {
|
||
t, _ := strconv.Atoi(hour[c[i]])
|
||
tmp += t
|
||
}
|
||
str = strconv.Itoa(tmp)
|
||
//fmt.Printf("找到解了 c = %v str = %v\n", c, str)
|
||
fmt.Printf("\"%v\", ", str)
|
||
return
|
||
}
|
||
for i := index; i < 4; i++ {
|
||
c = append(c, i)
|
||
findReadBinaryWatchHour(target-1, i+1, c, res)
|
||
c = c[:len(c)-1]
|
||
}
|
||
}
|
||
|
||
``` |