这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战。
题目描述:
401. 二进制手表 - 力扣(LeetCode) (leetcode-cn.com)
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
- 例如,下面的二进制手表读取 "3:25" 。
(图源:WikiMedia - Binary clock samui moon.jpg ,许可协议:Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) )
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
- 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。
分钟必须由两位数组成,可能会以零开头:
- 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。
示例一
输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
示例二
输入: turnedOn = 9
输出: []
提示:
0 <= turnedOn <= 10
思路分析
枚举时分
由图可知,上一行代表小时,有4个比特表示。
下一行代表分钟,有6个比特表示。
而比特 0 代表灯灭,1 代表灯亮,所以题目给出亮灯的个数,即比特值中 1 的个数,
而求 1 的个数,我们之前已经做过了,可以直接使用sdk的api,也可以手动实现。
要求解本题,简单点的话我们可以2遍循环
枚举小时和分钟的所有可能值,然后求出当中 1 的个数,如果等于 turnedOn ,则为答案之一。
然后还有个要注意的就是 小时不以 0 开头,分钟 个位数的情况下必须得有 0.
AC代码
class Solution {
fun readBinaryWatch(turnedOn: Int): List<String> {
val ans = ArrayList<String>()
for(h in 0..11) {
for(m in 0..59){
if(Integer.bitCount(h) + Integer.bitCount(m) == turnedOn) {
var m2 = m.toString()
if(m < 10) {
m2 = "0$m"
}
ans.add("$h:$m2")
}
}
}
return ans
}
}
总结
这题不错,但这表肯定没人买 - -