401.二进制手表

111 阅读1分钟

题目:
二进制手表顶部有 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
}