leetcode每日一题系列-二进制手表

134 阅读1分钟

leetcode-401-二进制手表

[博客链接]

一个菜🐔的学习之路

掘金首页

[题目描述]

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

 给你一个整数 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 

 Related Topics 位运算 回溯算法 
 👍 270 👎 0

[题目链接]

leetcode题目链接

[github地址]

代码链接

[思路介绍]

思路一:暴力匹配

  • 确定小时区亮灯数量,然后遍历所有可行方案
  • 格式化输出
class Solution {
        //思路一:暴力破解
        //确定小时区亮灯数量,然后遍历所有可行方案
        //格式化所有时间解
        int hourCount = 12;
        int minuteCount = 60;

        public List<String> readBinaryWatch(int turnedOn) {
            List<String> res = new ArrayList<>();
            //corner case
            for (int i = 0; i < hourCount; i++) {
                for (int j = 0; j < minuteCount; j++) {
                    if (Integer.bitCount(i) + Integer.bitCount(j) == turnedOn) {
                        res.add(i + ":" + ((j < 10) ? "0" + j : j));
                    }
                }
            }
            return res;
        }
}

时间复杂度O(1),常数级


思路二:位运算枚举

  • 题目最大为**2102^{10}=1024遍历1024**
  • 取高4位 低六位 然后判断遍历数比特位1的数量和turnedon相等即可
 public List<String> readBinaryWatch(int turnedOn) {
            List<String> ans = new ArrayList<String>();
            for (int i = 0; i < 1024; ++i) {
                int h = i >> 6, m = i & 63; // 用位运算取出高 4 位和低 6 位
                if (h < 12 && m < 60 && Integer.bitCount(i) == turnedOn) 				{		
                    ans.add(h + ":" + (m < 10 ? "0" : "") + m);
                }
            }
            return ans;
        }

时间复杂度O(1),常数级