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>
這個庫。