[LeetCode] 401. Binary Watch 二进制表
A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).
Each LED represents a zero or one, with the least significant bit on the right.
For example, the above binary watch reads "3:25".
Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.
Example:
Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
Note:
- The order of output does not matter.
- The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".
- The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02".
用二进制数字表示的表,小时用4个二进制数表示,分钟用6个二进制数表示,亮的地方代表1,不亮的代表0。给定一个非负整数n,代表现在亮的的个数,问能表示的所有可能时间?
解法1:DFS,遍历每一种可能。
解法2:枚举小时h和分钟m,然后判断二进制1的个数是否等于num。
解法3:位运算(Bit Manipulation)10盏灯泡的燃亮情况可以通过0-1024进行表示,然后计数二进制1的个数即可。利用位运算将状态拆分为小时和分钟。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | public class Solution { public List<String> readBinaryWatch( int num) { List<String> list = new ArrayList<>(); int timecode[] = new int [ 10 ]; dfs(timecode, 0 , 0 , list, num); return list; } private void dfs( int [] timecode, int i, int k, List<String> list, int num) { if (k == num) { String res = decodeToTime(timecode); if (res != null ) list.add(res); return ; } if (i == timecode.length) return ; timecode[i] = 1 ; dfs(timecode, i+ 1 , k+ 1 , list, num); timecode[i] = 0 ; dfs(timecode, i+ 1 , k, list, num); } //输出时间,即输出可能的时间,要是时间不对则输出null private String decodeToTime( int [] timecode) { int hours = 0 ; //按照位数转换时间 for ( int i = 0 ; i < 4 ; i++) { if (timecode[i] == 1 ) { hours = hours + ( int )Math.pow( 2 , i); } } int minutes = 0 ; for ( int i = 4 ; i < 10 ; i++) { if (timecode[i] == 1 ) { minutes = minutes + ( int )Math.pow( 2 , i- 4 ); } } String min = "" + minutes; if (minutes < 10 ) min = "0" + min; //判断时间的可行性 if (hours >= 12 || minutes >= 60 ) return null ; return hours + ":" + min; } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution( object ): def readBinaryWatch( self , num): """ :type num: int :rtype: List[str] """ ans = [] for h in range ( 12 ): for m in range ( 60 ): if ( bin (h) + bin (m)).count( '1' ) = = num: ans.append( '%d:%02d' % (h, m)) return ans |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Solution( object ): def readBinaryWatch( self , num): """ :type num: int :rtype: List[str] """ ans = [] for x in range ( 1024 ): if bin (x).count( '1' ) = = num: h, m = x >> 6 , x & 0x3F if h < 12 and m < 60 : ans.append( '%d:%02d' % (h, m)) return ans |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步