概述
一、题目大意
一个二进制手表顶端有4盏LED灯表示小时(0-11),底部有6盏LED灯表示分钟(0-59)。
每一盏LED灯表示一个0或1,最右端为最低位。
例如上图中的例子读数为”3:25”。
给定一个非负整数n表示当前燃亮的LED灯数,返回所有可能表示的时间。
注意:
输出顺序不重要。
小时不可以包含前缀0,例如”01:00”是无效的,应当为”1:00”。
分钟必须包含两位数字,可以包含前导0,例如”10:2”是无效的,应当为”10:02”。
二、分析:主要有一下三种方法
1,二进制法:是10位,最大1024,然后遍历,找二进制里面1的个数为满足要求的,然后判断是否超限,题目说的很清楚,小时0到11,分钟0到59,然后转化成要求的格式就行了。(python实现比较简单,python有很好的内置的函数)
2,正向遍历:对于一个num,每时针,分针点数的可能性进行遍历,然后组合即可。(例如num=5,时针2,分针3。就可以去找时针的2项子集,分针的3项子集,然后组合)
3,用数组记录一定数量灯亮的时候代表的是多少小时(分钟)。比如,
upLight[2].time存储的是上面2个灯亮的时候可能的小时数为3、5、9、6、10
downLight[2].time存储的是下面2个灯亮的时候可能的分钟数2、5、9、17、33、6、10、18、34、12、20、36、24、40、48。
三、java实现2,3方法
1,方法2
public class C401_2 {
public static void main(String[] args) {
int num = 2;
List<String> res = readBinaryWatch(num);
for(String s : res) {
System.out.print(" " + s);
}
}
static int[] hour = {1,2,4,8};
static int[] minu = {1,2,4,8,16,32};
static List<Integer> list = new ArrayList<>();
static List<Integer> hs = new ArrayList<>();
static List<Integer> ms = new ArrayList<>();
public static List<String> readBinaryWatch(int num) {
List<String> result = new ArrayList<>();
for(int h=0;h<=num;h++) {
dspCombination(hour,h, 0, true);
dspCombination(minu, num-h, 0, false);
for(int i:hs) {
for(int j:ms) {
if(j<10)
result.add("" + i + ":0" + j);
else
result.add("" + i + ":" + j);
}
}
hs.clear();
ms.clear();
}
return result;
}
public static void dspCombination(int[] nums,int k,int level,boolean flag) {//找一种情况的子集
if(list.size() == k) {
int sum = 0;
for(int num:list) {
sum += num;
}
if(flag) {
if(sum<=11)
hs.add(sum);
}else {
if(sum<=59)
ms.add(sum);
}
return;
}else if(list.size() > k) {
return;
}else {
for(int i=level;i<nums.length;i++) {
list.add(nums[i]);
dspCombination(nums, k, i+1, flag);
list.remove(list.size()-1);
}
}
}
}
2,方法3
static class light {
List<Integer> time = new ArrayList<>();
}
private static light[] hours = new light[5];//4盏灯表示小时,可以亮0,1,2,3,4盏
private static light[] minutes = new light[7];//6盏灯表示分钟,可以亮0,1,2,3,4,5,6盏
public static List<String> readBinaryWatch(int num) {
List<String> result = new ArrayList<>();
init(11, hours);
init(59, minutes);
for(int up =0;up<=num && up <= 4;up++) {//如果亮num盏,可以分为时针亮up盏,分针亮down盏
int down = num -up;
for(int hour : hours[up].time) {
if(down < 7 ) {
for(int minute : minutes[down].time) {
if(minute >= 10)
result.add("" + hour + ":" + minute);
else
result.add("" + hour + ":0" + minute);
}
}
}
}
return result;
}
public static void init(int k,light[] light) {//把每个小时或分钟划分到相应的灯数上,例如4点钟是由1个灯表示
for(int i=0;i<light.length;i++) {
light[i] = new light();
}
for(int i=0;i <= k;i++) {
int t = i;
int cnt = 0;
while(t>0) {
if(t%2 == 1) cnt++;
t >>= 1;
}
light[cnt].time.add(i);
}
}
3,方法3(直接)
public static List<String> readBinaryWatch2(int num) {
int[][] H = {{0},{1,2,4,8},{3,5,9,6,10},{7,11},{}};
int[][] M = {{0},{1,2,4,8,16,32},
{3,5,6,9,10,12,17,18,20,24,33,34,36,40,48},
{7,11,13,14,19,21,22,25,26,28,35,37,38,41,42,44,49,50,52,56},
{15,23,27,29,30,39,43,45,46,51,53,54,57,58},
{31,47,55,59},{}};
List<String> result = new ArrayList<>();
for(int up =0;up<=num && up <= 4;up++) {//将
int down = num -up;
for(int hour : H[up]) {
if(down < 7 ) {
for(int minute : M[down]) {
if(minute >= 10)
result.add("" + hour + ":" + minute);
else
result.add("" + hour + ":0" + minute);
}
}
}
}
return result;
}
四、python实现
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
最后
以上就是帅气含羞草为你收集整理的leetcode_401(二进制表)的全部内容,希望文章能够帮你解决leetcode_401(二进制表)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复