website/content.en/ChapterFour/0400~0499/0401.Binary-Watch.md
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:
A binary watch has 4 LEDs on the top representing hours (0-11), and 6 LEDs on the bottom representing minutes (0-59). Each LED represents a 0 or 1, with the least significant bit on the right.
Given a non-negative integer n representing the number of LEDs that are currently on, return all possible times the binary watch could represent.
findReadBinaryWatchMinute() and findReadBinaryWatchHour().
package leetcode
import (
"fmt"
"strconv"
)
// Solution 1
func readBinaryWatch(num int) []string {
memo := make([]int, 60)
// count the number of 1 in a binary number
count := func(n int) int {
if memo[n] != 0 {
return memo[n]
}
originN, res := n, 0
for n != 0 {
n = n & (n - 1)
res++
}
memo[originN] = res
return res
}
// fmtMinute format minute 0:1 -> 0:01
fmtMinute := func(m int) string {
if m < 10 {
return "0" + strconv.Itoa(m)
}
return strconv.Itoa(m)
}
var res []string
// traverse 0:00 -> 12:00
for i := 0; i < 12; i++ {
for j := 0; j < 60; j++ {
if count(i)+count(j) == num {
res = append(res, strconv.Itoa(i)+":"+fmtMinute(j))
}
}
}
return res
}
// Solution 2 Lookup table
var (
hour = []string{"1", "2", "4", "8"}
minute = []string{"01", "02", "04", "08", "16", "32"}
hourMap = map[int][]string{
0: {"0"},
1: {"1", "2", "4", "8"},
2: {"3", "5", "9", "6", "10"},
3: {"7", "11"},
}
minuteMap = map[int][]string{
0: {"00"},
1: {"01", "02", "04", "08", "16", "32"},
2: {"03", "05", "09", "17", "33", "06", "10", "18", "34", "12", "20", "36", "24", "40", "48"},
3: {"07", "11", "19", "35", "13", "21", "37", "25", "41", "49", "14", "22", "38", "26", "42", "50", "28", "44", "52", "56"},
4: {"15", "23", "39", "27", "43", "51", "29", "45", "53", "57", "30", "46", "54", "58"},
5: {"31", "47", "55", "59"},
}
)
func readBinaryWatch1(num int) []string {
var res []string
if num > 8 {
return res
}
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
}
/// ---------------------------------------
/// ---------------------------------------
/// ---------------------------------------
/// ---------------------------------------
/// ---------------------------------------
// The following are functions used for generating the lookup table
// Call findReadBinaryWatchMinute(num, 0, c, &res) to generate the lookup table
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("Found a solution 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]
}
}
// Call findReadBinaryWatchHour(num, 0, c, &res) to generate the lookup table
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("Found a solution 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]
}
}