LeeCode 题目–二进制手表(java)

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;
    }
}

总结

这个二进制手表这一题,解题主要的方法有关于 ------位运算还有暴力遍历的方法,本来还以为会超出时间限制的。提交之后竟然可以通过。 今天又做了一题,虽然是简单的题目,但最终还是自己慢慢做出来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值