题目:
二进制手表顶部有 4 个 LED 代表 小时(0-11) ,底部的 6 个 LED 代表 分钟(0-59) 。每个 LED 代表一个 0 或 1,最低位在右侧。
算法:
方法一:枚举
func readBinaryWatch(turnedOn int) []string {
ans := make([]string, 0)
for i := 0; i < 12; i ++ {
for j := 0; j < 60; j ++ {
if count(i) + count(j) == turnedOn {
hour := fmt.Sprintf("%d", i)
minute := fmt.Sprintf("%d", j)
if j < 10 {
minute = fmt.Sprintf("0%d", j)
}
ans = append(ans, hour + ":" + minute)
}
}
}
return ans
}
func count(n int) int {
cnt := 0
for n > 0 {
n = n & (n - 1)
cnt ++
}
return cnt
}
方法二:回溯
func readBinaryWatch(turnedOn int) []string {
ans := make([]string, 0)
hours := []int{1,2,4,8,0,0,0,0,0,0}
minutes := []int{0,0,0,0,1,2,4,8,16,32}
var backtrack func(num, index, hour, minute int)
backtrack = func(num, index, hour, minute int){
if hour > 11 || minute > 59 {
return
}
if num == 0 {
ans = append(ans, fmt.Sprintf("%d:%02d", hour, minute))
} else {
for i := index; i < 10; i ++ {
backtrack(num - 1, i + 1, hour + hours[i], minute + minutes[i])
}
}
}
backtrack(turnedOn, 0, 0, 0)
return ans
}