LeetCode-401-二进制手表-C语言

/**
 * 算法思想:
 * 套用回溯算法框架。
 * 
 */
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;
}


猜你喜欢

转载自blog.csdn.net/weixin_36094222/article/details/90206385
今日推荐