leetcode 401. 二进制手表
二进制手表顶部有 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" 。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
采用暴力,先统计出0-60每个数子出现1的个数,小时只可能0-3个1,分钟0-5个1。两层for循环判断。
public List<String> readBinaryWatch(int turnedOn) { List<String> value = new ArrayList<>(); if (turnedOn > 8) { return value; } ArrayList<Integer>[] list = (ArrayList<Integer>[])new ArrayList<?>[6]; list[0] = new ArrayList<Integer>(){{ add(0); }}; for (int i = 1; i < 60; i++) { int n = 1; int item = i; while ((item & (item - 1)) != 0) { n++; item = (item & (item - 1)); } List<Integer> strings = list[n]; if (strings == null) { strings = new ArrayList<>(); list[n] = (ArrayList<Integer>) strings; } strings.add(i); } for (int i = 0; i < 4; i++) { int b = turnedOn - i; if (b > 5 || b < 0) { continue; } ArrayList<Integer> aa = list[i]; ArrayList<Integer> ba = list[b]; for (Integer h : aa) { if (h > 11) { break; } for (Integer m : ba) { value.add(h + ":" + (m > 9 ? m : "0" + m)); } } } return value; }