2017-03-20 20:51:00 星期一
1.Description
https://leetcode.com/problems/binary-watch/#/description
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”.
解读
给定二进制数码表中亮灯的个数,去罗列所有的可能结果,最先能够想到的办法应该是遍历
2.Solution
2.1逆向思考
从可能出现的结果中进行遍历,总共有12*60中情况,如果结合中1的个数刚好和题目中给的个数相等,那么就是正确答案,记录,继续;否则,跳过,继续
https://leetcode.com/problems/binary-watch/#/solutions
class Solution(object):
def readBinaryWatch(self, num):
"""
:type num: int
:rtype: List[str]
"""
return ['%d:%02d'%(h,m)
for h in range(12) for m in range(60)
if((bin(h)+bin(m)).count('1')==num)]
下面是java版本
public List<String> readBinaryWatch(int num) {
List<String> times=new ArrayList<String>();
for(int h=0;h<12;h++)
for(int m=0;m<60;m++)
if((Integer.bitCount(h))+(Integer.bitCount(m)) == num)
times.add(String.format("%d:%02d", h,m));
return times;
}
2.2正向思考
总共有num个灯亮,可以从[1,2,4,8,16,32]的分钟集合和[60, 120, 240, 480]选取其中的num个,但是有个问题就是时针的和不能超过60
class Solution(object):
def readBinaryWatch(self, num):
result = []
h = [60, 120, 240, 480]
m = [1, 2, 4, 8, 16, 32]
# m+h构成全部的集合,取其中的num个进行组合
iter = itertools.combinations(m + h, num)
for item in iter:
# 目的:排除分针灯和 超过60min的可能
# 方法:构成的组合转为集合与分钟的集合求交集,求和,大于60跳过
if sum(set(item) & set(m)) >= 60:
continue
# 求小时和分钟
x, y = divmod(sum(item), 60)
if x < 12 and y < 60:
result.append("%d:%02d" % (x, y)) # 格式化输出
return result