Leetcode Binary Watch

题意:手表用二进制显示时间,给出亮灯的个数,求可能的时间。

思路:枚举子集的个数。这里数量较小,直接用二进制枚举。

class Solution {
public:
    vector<string> readBinaryWatch(int num) {
        vector<int> h(4, 1);
        for(int i = 1; i < h.size(); i ++ ) {
            h[i] = h[i - 1] * 2;
        }
        vector<int> m(6, 1);
        for(int i = 1; i < m.size(); ++ i) {
            m[i] = m[i - 1] * 2;
        }
        
        vector<string> re;
        vector<int> myh, mym;
        for(int i = 0; i <= num; ++ i) {
            myh = dfsH(h, i);
            mym = dfsM(m, num - i);
            for(int j = 0; j < myh.size(); j ++) {
                string hour = std::to_string(myh[j]);
                for(int k = 0; k < mym.size(); k ++) {
                    string minutes;
                    if(mym[k] < 10) minutes = "0" + std::to_string(mym[k]);
                    else minutes = std::to_string(mym[k]);
                    re.push_back(hour + ":" + minutes);
                }
            }
        }
        
        return re;
    }
    
    vector<int> dfsH(vector<int> h, int nums) {
        vector<int> re;
        
        //int total = 7;
        for(int i = 0; i <= 15; ++ i) {
            if(ones(i) == nums && sum(h, i) < 12) {
                re.push_back(sum(h, i));
            }
        }
        
        return re;
        
    }
    vector<int> dfsM(vector<int> h, int nums) {
        vector<int> re;
        
        //int total = 127;
        for(int i = 0; i <= 127; ++ i) {
            if(ones(i) == nums && sum(h, i) < 60) { //cout << i << " " << ones(i) << " " << sum(h, i) << endl;
                re.push_back(sum(h, i));
            }
        }
        
        return re;
        
    }
    
    int ones(int n) {
        int cout = 0;
        while(n) {
            cout += n%2;
            n /= 2;
        }
        return cout;
    }
    
    int sum(vector<int> n, int ind) {
        int re = 0;
        int i = 0;
        while(ind) {
            if(i >= n.size()) return 1000;
            if(ind % 2) {
                re += n[i];
            }
            ind /= 2;
            i ++; //if(i >= n.size()) return 1000;
        }
        
        return re;
    }
};



猜你喜欢

转载自blog.csdn.net/markpen/article/details/61545751
今日推荐