401. Binary Watch(python+cpp)

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 resents 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”.

解释:
注意看Note里面要求。解法是逆向思维,不要从二进制的角度看,要从小时数和分钟数的角度看
python代码:

class Solution(object):
    def readBinaryWatch(self, num):
        """
        :type num: int
        :rtype: List[str]
        """
        result=[]
        for h in xrange(12):
            for m in xrange(60):
                if (bin(h).count('1')+bin(m).count('1')==num): 
                    if m<10:
                        result.append(str(h)+':'+'0'+str(m))
                    else:
                        result.append(str(h)+':'+str(m))
        return result

c++代码,需要自己实现十进制转二进制的函数:

#include<string>
using namespace std;
class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<string> result;
        for(int h=0;h<12;h++)
        {
            for(int m=0;m<60;m++)
            {
                string bin_h=dec2bin(h);
                string bin_m=dec2bin(m);
                if(count(bin_h.begin(),bin_h.end(),'1')+count(bin_m.begin(),bin_m.end(),'1')==num)
                {
                    if (m<10)
                        result.push_back(to_string(h)+":0"+to_string(m));
                    else
                        result.push_back(to_string(h)+":"+to_string(m));
                }   
            }
        }
        return result;
    }
    string dec2bin(int num)
    {
        string bin="";
        while (num)
        {
            bin=to_string(num%2)+bin;
            num/=2;
        }
        return bin;
    }
};

c++的另一种解法,用到<bitset>这个数据结构,不需要自己实现二进制转十进制的函数。用10位数字(1023)来表示当前时刻,后4位表示小时数,前6位表示分钟数。

#include<bitset>
using namespace std;
class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<string> result;
        for (int i=0;i<1023;i++)
        {
            bitset<10> ans(i);
            if(ans.count()==num)
            {
                int h=i&15;
                int m=(i>>4);
                if (m<60&&h<12)
                {
                    result.push_back(to_string(h)+":"+(m<10?"0":"")+to_string(m));  
                }
                
            }

        }
        return result;
    }
};

总结:
学会使用c++中<bitset>这个库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值