leetcode401二进制手表刷题打卡

简介: leetcode401二进制手表刷题打卡
401. 二进制手表

难度简单383

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

  • 例如,下面的二进制手表读取 "3:25"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTRin0Ez-1666625513530)(image\leetcode401.jpg)]

(图源:WikiMedia - Binary clock samui moon.jpg ,许可协议:Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头:

  • 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00"

分钟必须由两位数组成,可能会以零开头:

  • 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02"

示例 1:

输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]

示例 2:

输入:turnedOn = 9
输出:[]

提示:

  • 0 <= turnedOn <= 10

题解思路:

首先抛开字符串,抽象题目,从10个数字中选择turnedOn个数字,不能重复,就这么简单直接就可以用回溯枚举,伪代码如下

for(int i = startIndex; i < 10; i++){
    // 选择数字i
    backtracking();
    // 回溯数字i
}

这就是本题被扒光的情景,接下来就是根据题意一点一点的加限制条件

这道题被扒光了构造回溯抽象树太简单了,就不画了hhh

这十个数就是上图二进制手表上的数字,用一个vector容器来保存

vector<int> time{1, 2, 4, 8, 1, 2, 4, 8, 16, 32};
// 0-3代表小时,4-9代表分钟

先不管题目中要求返回字符串时间,我就用两个int型参数hoursminites来保存回溯提取的time,判断当前索引是在哪个区间就为哪个变量操作

if(i >= 0 && i <= 3){ // 处理小时
    hours += time[i];
    // backtracking
    hours -= time[i];
}else{                // 处理分钟
    minites += time[i];
    // backtracking...
    minites -= time[i];
}

递归三步

  • 确定参数和返回值
  • 遍历整棵回溯抽象树不需要返回值
  • 参数列表:
  • 需要一个countIndex来表示已经选择了多少个灯,用来参与终止条件
  • 选过的灯不能再次选择,所以需要一个startIndex,用于递归回溯同一节点的下一个节点
  • 确定终止条件
  • countIndex == turnedOn的时候就可以开始处理返回了
  • 前面我们已经获得了两个变量,一个表示小时,一个表示分钟,要将其处理为string串,而且分钟需要格式化输出,不足两位的前面要补零,我用的方法是使用头文件sstream中的ostringstream和头文件iomanip中的setwsetfillintstring用头文件string中的to_string函数
if(countIndex == turnedOn){
    if(hours > 11 || minites > 59) return ;
    string hour = to_string(hours);
    ostringstream minite;
    minite << setw(2) << setfill('0') << minites;  // cout 是将数据输出到控制台, ostringstream是输出到其字符串流中  .str() 可以提取其中的字符
    string maoHao = ":";
    result.push_back(hour + maoHao + minite.str());
}
  • 确定本层逻辑
  • 前面已经分析

完整代码

class Solution {
public:
    vector<string> result;
    // countIndex当前层共使用了多少灯
    void backtracking(vector<int> time,int turnedOn, int countIndex, int startIndex, int hours, int minites){
        if(countIndex == turnedOn){
            if(hours > 11 || minites > 59) return ;
            string hour = to_string(hours);
            ostringstream minite;
            minite << setw(2) << setfill('0') << minites; 
            string maoHao = ":";
            result.push_back(hour + maoHao + minite.str());
        }
        for(int i = startIndex; i < time.size(); i++){
            if(i >= 0 && i <= 3){ // 处理小时
                hours += time[i];
                backtracking(time, turnedOn, countIndex + 1, i + 1, hours, minites);
                hours -= time[i];
            }else{                // 处理分钟
                minites += time[i];
                backtracking(time, turnedOn, countIndex + 1, i + 1, hours, minites);
                minites -= time[i];
            }
        }
    }
    vector<string> readBinaryWatch(int turnedOn) {
        vector<int> time{1,2,4,8,1,2,4,8,16,32};  // hours:0-3 minites:4-9
        backtracking(time,turnedOn, 0, 0, 0, 0);
        return result;
    }
};


相关文章
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
28 6
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
28 4
|
13天前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
43 2
|
4天前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
13天前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
16 7
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
13 4
|
14天前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
32 5
|
13天前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
25 3
|
13天前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
11 3
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
25 3