目标
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
- 例如,下面的二进制手表读取 "4:51" 。

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
- 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。
分钟必须由两位数组成,可能会以零开头:
- 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。
示例 1:
输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
示例 2:
输入:turnedOn = 9
输出:[]
说明:
- 0 <= turnedOn <= 10
思路
有一个二进制手表,用 4 bit 表示小时, 6 bit 代表分钟。已知 bit 位为 1 的数量 turnedOn,返回所有可能的时间。
将数字按照置位数量分组,枚举不同的划分即可。
代码
/**
* @date 2026-02-24 17:34
*/
public class ReadBinaryWatch401 {
public List<String> readBinaryWatch(int turnedOn) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < 60; i++) {
int bc = Integer.bitCount(i);
map.putIfAbsent(bc, new ArrayList<>());
map.get(bc).add(i);
}
List<String> res = new ArrayList<>();
for (int i = 0; i < 4; i++) {
List<Integer> hours = map.get(i);
for (Integer h : hours) {
if (h > 11) {
break;
}
List<Integer> minutes = map.get(turnedOn - i);
if (minutes == null) {
continue;
}
for (Integer m : minutes) {
res.add(h + ":" + ((m < 10) ? "0" : "") + m);
}
}
}
return res;
}
}
性能
