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>
这个库。