void recursion(int* t, int minute, int hour, int n, int cur, int start, char** arr, int* pst){
if (minute >= 60 || hour >= 12) return;
if (cur == n){
char* s = (char*)calloc(10, sizeof(char));
int len = sprintf(s, "%d:", hour);
if (minute <10)
sprintf(s + len, "0%d", minute);
else{
sprintf(s + len, "%d", minute);
}
arr[(*pst)++] = s;
return;
}
for (int i = start; i <= cur + 10 - n; i++){
if (i<6)
recursion(t, minute + t[i], hour, n, cur + 1, i + 1, arr, pst);
else
recursion(t, minute, hour + t[i], n, cur + 1, i + 1, arr, pst);
}
}
char ** readBinaryWatch(int num, int* returnSize){
int t[] = { 1, 2, 4, 8, 16, 32, 1, 2, 4, 8 };
char** arr = (char**)calloc(1000, sizeof(char*));
int pst = 0;
recursion(t, 0, 0, num, 0, 0, arr, &pst);
*returnSize = pst;
return arr;
}
//C++
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> res;
//直接遍历 0:00 -> 12:00 每个时间有多少1
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 60; j++) {
if (count1(i) + count1(j) == num) {
res.push_back(to_string(i)+":"+
(j < 10 ? "0"+to_string(j) : to_string(j)));
}
}
}
return res;
}
//计算二进制中1的个数
int count1(int n) {
int res = 0;
while (n != 0) {
n = n & (n - 1);
res++;
}
return res;
}
};