LeetCode401 二进制手表

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

题目描述:

401. 二进制手表 - 力扣(LeetCode) (leetcode-cn.com)

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

  • 例如,下面的二进制手表读取 “3:25” 。

image.png
(图源: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” 。

示例一

1
2
css复制代码输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]

示例二

1
2
ini复制代码输入: turnedOn = 9
输出: []

提示:

  • 0 <= turnedOn <= 10

思路分析

枚举时分

由图可知,上一行代表小时,有4个比特表示。

下一行代表分钟,有6个比特表示。

而比特 0 代表灯灭,1 代表灯亮,所以题目给出亮灯的个数,即比特值中 1 的个数,

而求 1 的个数,我们之前已经做过了,可以直接使用sdk的api,也可以手动实现。

要求解本题,简单点的话我们可以2遍循环

枚举小时和分钟的所有可能值,然后求出当中 1 的个数,如果等于 turnedOn ,则为答案之一。

然后还有个要注意的就是 小时不以 0 开头,分钟 个位数的情况下必须得有 0.

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Kotlin复制代码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
    }
}

总结

这题不错,但这表肯定没人买 - -

参考

二进制手表 - 二进制手表 - 力扣(LeetCode) (leetcode-cn.com)

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%