/**
* 算法思想:
* 套用回溯算法框架。
*
*/
int get_num(char *s, int len){
int ret=0;
int lenth = len;
while(len--){
ret *= 2;
ret += *s++ - '0';
}
/* 4位为小时,6位为分钟,合法才返回整数,否则返回-1 */
if((lenth == 4 && ret< 12) || (lenth == 6 && ret<60)){
return ret;
}
return -1;
}
void get_one_time(char *s, int len, char **ret, int *ret_index) {
int i;
int h = get_num(s, 4);
int m = get_num(s+4, 6);
/* 非法直接返回,不添加到结果数组 */
if(h<0 || m<0) return;
/* check result exists */
ret[(*ret_index)] = (char *)malloc(sizeof(char) * 6);
sprintf(ret[(*ret_index)], "%d:%02d", h, m);
for(i=0; i<*ret_index; i++){
if(strcmp(ret[i], ret[*ret_index]) == 0){
free(ret[*ret_index]);
return;
}
}
(*ret_index)++;
}
void rec(char *s, int len, int left_num, int index, char **ret, int *ret_index) {
if(left_num < 0 || index > 10){
return;
}
/* 回溯完成时(即left_num使用完毕),添加结果 */
if(left_num == 0){
get_one_time(s, len, ret, ret_index);
}
/* 下面两轮回溯,表示该index位置既可以放置1,也可以放置0 */
s[index] = '1';
rec(s, len, left_num-1, index+1, ret, ret_index);
s[index] = '0';
rec(s, len, left_num, index+1, ret, ret_index);
s[index] = '0';
}
#define LEN 0xffff
char ** readBinaryWatch(int num, int* returnSize){
char **ret = (char **)malloc(sizeof(char *)* LEN);
int ret_index = 0;
char buffer[] = "00000000000";
rec(buffer, 10, num, 0, ret, &ret_index);
*returnSize = ret_index;
return ret;
}
LeetCode-401-二进制手表-C语言
猜你喜欢
转载自blog.csdn.net/weixin_36094222/article/details/90206385
今日推荐
周排行