func readBinaryWatch(turnedOn int) []string {
if turnedOn >= 9 {//panic("不能正确示意")
return []string{}
}
maxHnum := 3
maxMnum := 5
returnData := make([]string, 0, 255)
for hourNum, minuteNum := 0, 0; hourNum <= maxHnum; hourNum++ {
minuteNum = turnedOn - hourNum
if (minuteNum < 0) {break;}
if minuteNum >maxMnum {continue}
hourList := getHour(hourNum)
minuteList := getMinute(minuteNum)
for _, h := range hourList {
for _, m := range minuteList {returnData = append(returnData, h + ":" + m)
}
}
}
return returnData
}
func getMinute(n int) []string {if (n == 0) {return []string{"00"}
}
cSet := []int{1, 2, 4, 8, 16, 32}
num := make([]string, 0, 60)
list := sumNumItem(cSet, n)
for _, v := range list {
if v > 59 {continue}
num = append(num, fmt.Sprintf("%02d", v))
}
return num
}
func getHour(n int) []string {if (n == 0) {return []string {"0"}
}
cSet := []int{1, 2, 4, 8}
num := make([]string, 0, 60)
list := sumNumItem(cSet, n)
for _, v := range list {
if v > 11 {continue}
num = append(num, fmt.Sprintf("%d", v))
}
return num
}
func sumNumItem(list []int, num int) []int {l := len(list)
if num > l {//panic("求和数量异样")
return []int{}
}
if num == 1 {return list}
returnData := make([]int, 0, 60)
// 应用位图对应形式,顺次确认站位组合
indexList := make([]int, l)
for i := 0; i < num; i++ {indexList[i] = 1
}
returnData = append(returnData, sumIdxNum(list, indexList))
for {
find := false
for i := 0; i < l - 1; i++ {if (indexList[i] == 1 && indexList[i + 1] == 0) {
find = true
indexList[i], indexList[i + 1] = 0, 1
if indexList[0] == 0 && i > 1 {resetZeroIdx(indexList, i)
}
returnData = append(returnData, sumIdxNum(list, indexList))
break
}
}
if !find {break}
}
return returnData
}
func sumIdxNum(list []int, idxSet []int) int {
num := 0
for idx, b := range idxSet {
if b == 1 {num += list[idx]
}
}
return num
}
func resetZeroIdx(idxList []int, k int) {
sum := 0
for i := 0; i < k; i++ {if idxList[i] == 1 {sum++}
}
// 将前 sum 个改为 1,之后的改为 0
for i := 0; i < k; i++ {
if i < sum {idxList[i] = 1
} else {idxList[i] = 0
}
}
}