1. 程式人生 > >401. Binary Watch(python+cpp)

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