这是悦乐书的第216次更新,第229篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第84题(顺位题号是401)。二进制手表顶部有4个LED,代表小时(0-11),底部的6个LED代表分钟(0-59)。每个LED代表一个零或一个,右侧的最低有效位。给定非负整数n表示当前打开的LED数量,返回手表可能代表的所有可能时间。例如:

输入:n = 1

输出:[“1:00”,“2:00”,“4:00”,“8:00”,“0:01”,“0:02”,“0:04”,“0:08” ,“0:16”,“0:32”]

注意

  • 输出顺序无关紧要。
  • 小时不得包含前导零,例如“01:00”无效,应为“1:00”。
  • 分钟必须由两位数组成,并且可能包含前导零,例如“10:2”无效,应为“10:02”。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

代表小时的有四个灯,代表分钟的有六个灯,传入的参数num就是小时加分钟所代表的亮灯数之和,所以只要小时加分钟的亮灯数等于num,就代表可能的一种时间。可以联想到使用位操作,亮就表示1,不亮就表示0,因为只要计算1的位数等于num即可。使用两层循环,外层循环是小时,从0到11,内层循环是分钟,从0到59,如果小时加分钟的二进制1位计数之和等于num,就将其添加进list中。

public List<String> readBinaryWatch(int num) {
List<String> list = new ArrayList<String>();
for (int i=0; i<12; i++) {
for (int j=0; j<60; j++) {
if (Integer.bitCount(i)+Integer.bitCount(j) == num) {
String answer = "";
if (j < 10) {
answer = i + ":0" + j;
} else {
answer = i + ":" + j;
}
list.add(answer);
}
}
}
return list;
}

03 第二种解法

此题也可以理解为从n个数中取出k个数的问题,小时有四个数,分钟有六个数,要从这10个数中取出num个数来,组合成满足条件的时间。比如,num等于2,那么从小时中就可以取1次,剩下的1次在分钟里取,也可以全部在小时里取,也可以全部在分钟中取,只要次数不超过num即可。同时,要先将两种特殊情况排除出去。

public List<String> readBinaryWatch2(int num) {
List<String> list = new ArrayList<String>();
if (num == 0) {
list.add("0:00");
return list;
}
if (num > 8) {
return list;
}
int[] temp = {8,4,2,1,32,16,8,4,2,1};
boolean[] index = new boolean[10];
helperFun(list, temp, index, num, 0);
return list;
} void helperFun(List<String> list, int[] temp, boolean[] index, int num, int start){
if (num == 0) {
int hour = 0;
int minute = 0;
for (int k = 0; k < 10; k++) {
if (index[k] == true && k <= 3) {
hour += temp[k];
}
if (index[k] == true && k > 3) {
minute += temp[k];
}
}
if (hour >= 12 || minute >= 60) {
return;
} else {
String answer = "";
if (minute < 10) {
answer = hour + ":0" + minute;
} else {
answer = hour + ":" + minute;
}
list.add(answer);
return;
}
}
for (int i = start; i < temp.length; i++) {
index[i] = true;
helperFun(list, temp, index, num - 1, i + 1);
index[i] = false;
}
}

04 第三种解法

思路和第二种解法类似,但是要比第二种解法精简些。我们将表示小时和分钟的数组设置为全局变量,这样就不必在递归的方法里面每次都传入,并且还要判断使用过没有,使用一个指针来帮助我们判断即可,当指针小于4的时候,都是在小时中取,所以小时需要加上数组中新的小时数,而分钟不变,当指针大于等于4的时候,就是在分钟里取,所以分钟要加上数组中新的分钟数,而小时不变。而num是一直在递减的。当小时大于11或者分钟大于59时,直接return,这是递归的结束条件。

private int[] all = {1,2,4,8,1,2,4,8,16,32};
public List<String> readBinaryWatch3(int num) {
List<String> list = new ArrayList<String>();
helperFun(list, num, 0, 0, 0);
return list;
} void helperFun(List<String> list, int num, int hour, int minute, int index) {
if (hour > 11 || minute > 59) {
return;
}
if (num == 0) {
String answer = "";
if (minute < 10) {
answer = hour + ":0" + minute;
} else {
answer = hour + ":" + minute;
}
list.add(answer);
}
for (int i=index; i<10; i++) {
if (i < 4) {
helperFun(list, num-1, hour+all[i], minute, i+1);
} else {
helperFun(list, num-1, hour, minute+all[i], i+1);
}
}
}

05 小结

算法专题目前已连续日更超过两个月,算法题文章84+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Binary Watch(Java实现)的更多相关文章

  1. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  2. LeetCode算法题-Binary Number with Alternating Bits(Java实现)

    这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...

  3. LeetCode算法题-Binary Tree Tilt(Java实现)

    这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...

  4. LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  5. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...

  6. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  7. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  8. LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

    这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...

  9. LeetCode算法题-Trim a Binary Search Tree(Java实现)

    这是悦乐书的第284次更新,第301篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第152题(顺位题号是669).给定二叉搜索树以及L和R的最低和最高边界,修剪树以使其所 ...

随机推荐

  1. Perl文件句柄相关常量变量

    文件句柄相关变量 对应的官方手册:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles 默认情况下: $/:输入行 ...

  2. Go基础系列:为select设置超时时间

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...

  3. Spring Cloud Finchley版中Consul多实例注册的问题处理

    由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得 ...

  4. shell编程基础(五): 正则表达式及其使用

    正则表达式 1.前情提要 以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义.其实grep还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合xxxx ...

  5. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 本篇文章操作系统信息 Linux:ubu ...

  6. 阿里云免费SSL证书申请与安装使用(IIS7)

    准备: 阿里云已完成备案的域名一个 第一步:免费SSL证书申请 登陆阿里云平台,在域名控制台下,选择你的域名,点击“SSL”证书,如图所示 再跳转后的页面,选择“单域名免费证书”,并补全域名,非二级域 ...

  7. npoi实现数据导出Excel

    npoi     .NET第三方的Office功能组件. 链接地址 http://npoi.codeplex.com/ 引用命名空间 using NPOI.HSSF.UserModel; using ...

  8. 【Java每日一题】20170220

    20170217问题解析请点击今日问题下方的“[Java每日一题]20170220”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  9. C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  10. js 函数重载

    简单定义:根据不同参数长度来实现让同一个函数,进行不同处理. function addMethod (obj, name, fun) { let old = obj[name] obj[name] = ...