https://leetcode-cn.com/problems/binary-watch/
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。
每个 LED 代表一个 0 或 1,最低位在右侧。
例如,上面的二进制手表读取 “3:25”。
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
案例:
输入: n = 1
返回: [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]
注意事项:
输出的顺序没有要求。
小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。
思路: 回溯算法(暴力穷举,验证是否为正确的时间)
/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ void DFS(int index, int h, int m, int num, int *returnSize, char **ret){ if(0 == num){ if(h > 11 || m > 59){ return; } ret[*returnSize] = (char *)calloc(100, sizeof(char)); if(m < 10){ snprintf(ret[*returnSize], 6, "%d:0%d", h, m); }else{ snprintf(ret[*returnSize], 6, "%d:%d", h, m); } int len = strlen(ret[*returnSize]); ret[*returnSize][len] = '\0'; *returnSize += 1; } int i = index; for(; i < 10; i++){ if(i < 6){ // m m += pow(2, i); DFS(i + 1, h, m, num - 1, returnSize, ret); m -= pow(2, i); }else { // h h += pow(2, (i - 6)); DFS(i + 1, h, m, num - 1, returnSize, ret); h -= pow(2, (i - 6)); } } } char** readBinaryWatch(int num, int* returnSize) { if(num < 0 || num > 8){ *returnSize = 0; return NULL; } char **ret = (char **)calloc(1024, sizeof(char *)); *returnSize = 0; DFS(0, 0, 0, num, returnSize, ret); return ret; }