题意:手表用二进制显示时间,给出亮灯的个数,求可能的时间。
思路:枚举子集的个数。这里数量较小,直接用二进制枚举。
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;
}
};