LeeCode 题目–二进制手表(java)
一、二进制手表
二进制手表顶部有 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
输出:[]
来源:力扣(LeetCode)
二、解题思路
1.理解题目(转换思维)
输入turnedOn为手表灯亮的个数,也可以理解为手表显示的时间,将时间的数值转换为二进制数,该二进制数的含1的个数
2.解题关键
参考的另一题(Leecode–位1的个数)
题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
解题代码如下(Java):
public class Solution {
public int hammingWeight(int n) {
int ret = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1 << i)) != 0) {
ret++;
}
}
return ret;
}
}
3.解题代码
class Solution {
public List<String> readBinaryWatch(int turnedOn) {
List<String> rs = new ArrayList<String>();
if(turnedOn==0){
rs.add("0:00");
return rs;
}
else if(turnedOn>8){
return rs;
}
//遍历时钟每个数 符合要求个数即可输入数字为0到11所以要小于等于11,同理于59
for(int h=0;h<=11;h++){
//从时钟个数1到4开始
for(int t=0;t<=turnedOn&&t<4;t++){
if(returnhh(h)==t){
int num = turnedOn - t;
//若时间个数为0既不需要遍历
if(num<=0){
//加入时间
rs.add(returntime(h,0));
}
else if(num>0){
for(int m=0;m<=59;m++){
if(returnmm(m)==num){
rs.add(returntime(h,m));
}
}
}
}
}
}
return rs;
}
//显示时钟的个数为4,所以判读显示时钟中的为1的个数最多为4个
public int returnhh(int n){
int ret = 0;
for (int i = 0; i < 4; i++) {
if ((n & (1 << i)) != 0) {
ret++;
}
}
return ret;
}
//显示分钟的个数为4,所以判读显示分钟中的为1的个数最多为6个
public int returnmm(int n){
int ret = 0;
for (int i = 0; i < 6; i++) {
if ((n & (1 << i)) != 0) {
ret++;
}
}
return ret;
}
//返回最终的时间格式
public String returntime(int h,int m){
String hh,mm;
hh = Integer.toString(h);
mm = Integer.toString(m);
if(m<=9){
mm = "0"+mm;
}
return hh+":"+mm;
}
}