【C语言】【Leetcode】2437. 有效时间的数目

文章目录


题目

链接: link


思路一、枚举

这题的可以简单的看成 h1 h2 : m1 m2 的情况,其中 h1 和 h2 有关, m1 和 m2 有关,数目不多可以直接暴力枚举解决

csharp 复制代码
int countTime(char * time) {
    int countHour = 0;
    int countMinute = 0;
    for (int i = 0; i < 24; i++) {
        int hiHour = i / 10;
        int loHour = i % 10;
        if ((time[0] == '?' || time[0] == hiHour + '0') && 
            (time[1] == '?' || time[1] == loHour + '0')) {
            countHour++;
        }
    } 
    for (int i = 0; i < 60; i++) {
        int hiMinute = i / 10;
        int loMinute = i % 10;
        if ((time[3] == '?' || time[3] == hiMinute + '0') && 
            (time[4] == '?' || time[4] == loMinute + '0')) {
            countMinute++;
        }
    }
    return countHour * countMinute;
}

由于时钟的最大值为 24,分钟的最大值为 60,在此题解中分别枚举所可能的时钟,以及所有可能分钟,时间复杂度为 O(24+60)=O(1)。

只要理清楚还是很好做的


思路二、回溯

由于当出现 '?' 时,我们可以填入 0 - 9 任意一个数字,然后再返回去看是否合法就行。

即 00<= h1h2 <=23 、 00<= m1m2 <=59

csharp 复制代码
bool check(const char *time) {
    //atoi提取数字,遇到非数字时停止
    int h1h2 = atoi(time);
    int m1m2 = atoi(time + 3);
    if (h1h2 < 24 && m1m2 < 60) {//正常读取时不会出现负号,所以无所谓>=0
        return true;
    } else {
        return false;
    }
}

void dfs(char *time, int pos, int *res) {
    if (time[pos] == '\0') {//每次循环到结尾才去看这时是否合法
        if (check(time)) {
            (*res)++;
        }
        return;
    }
    if (time[pos] == '?') {
        for (int i = 0; i <= 9; i++) {
            time[pos] = '0' + i;
            dfs(time, pos + 1, res);
            time[pos] = '?';
        }
    } else {
        dfs(time, pos + 1, res);
    }
}

int countTime(char * time){
    int res = 0;//记录可能性
    dfs(time, 0, &res);
    return res;
}
相关推荐
knd_max1 小时前
C语言:内存函数
c语言
YLCHUP1 小时前
【联通分量】题解:P13823 「Diligent-OI R2 C」所谓伊人_连通分量_最短路_01bfs_图论_C++算法竞赛
c语言·数据结构·c++·算法·图论·广度优先·图搜索算法
特立独行的猫a3 小时前
C/C++三方库移植到HarmonyOS平台详细教程
c语言·c++·harmonyos·napi·三方库·aki
qq_433554547 小时前
C++深度优先搜素
开发语言·c++·深度优先
啟明起鸣10 小时前
【数据结构】B 树——高度近似可”独木成林“的榕树——详细解说与其 C 代码实现
c语言·开发语言·数据结构
nonono10 小时前
数据结构——线性表(链表,力扣中等篇,技巧型)
数据结构·leetcode·链表
XH华11 小时前
C语言第十三章自定义类型:联合和枚举
c语言·开发语言
草莓熊Lotso11 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day13
c语言·开发语言·刷题·强化训练
luckycoding12 小时前
1424. 对角线遍历 II
算法·leetcode·职场和发展
刃神太酷啦12 小时前
Linux 常用指令全解析:从基础操作到系统管理(1w字精简版)----《Hello Linux!》(2)
linux·运维·服务器·c语言·c++·算法·leetcode