题目描述
题干:
给你一个整数 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
输出:[]
题解思路
这里返回所有可能的时间,因为只有10位二进制数字来表示时间
只要满足得到二进制1的数量为给定的的值,就可以返回
唯一要注意的就是,小时和分钟不要超过12和60即可,这也代表这类表只能采用12小时制
正确代码
public List<String> readBinaryWatch(int turnedOn) {
List<String> list = new ArrayList<>();
for (int h = 0; h < 12; ++h) {
for (int m = 0; m < 60; ++m) {
if (Integer.bitCount(h) + Integer.bitCount(m) == turnedOn) {
list.add(h + ":" + (m < 10 ? "0" : "") + m);
}
}
}
return list;
}
总结
这里无论是像代码这样分开记录小时和分钟,还是连续10位二进制,前4位是小时,后六位代表分钟
值得抬杠的是,这里官方居然说是枚举,复杂度为O(1),有一说一,感觉还是像O(n^2)
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见