LeetCode——401. 二进制手表(Java)

题目描述

题干:
给你一个整数 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)

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-06-21 08:36  21岁还不是架构师  阅读(106)  评论(0编辑  收藏  举报