【leetcode】【401】二进制手表

发布时间 2023-08-15 16:38:58作者: BJFU-VTH

https://leetcode.cn/problems/binary-watch/description/

分析

这是典型的循环DFS问题。

循环DFS一般应用在:

1. 输出字符的按位全排列。(比如一共4个数字,输出3个数字的全部组合)

2. 输出字符的全排列。(结合visited数组)

3. 本题这种组合型问题。

思路

对函数进行拆分。

首先我们要有一个总入口,控制异常场景等情况(比如全为0)。

其次,我们需要有DFS总入口。

最后,我们需要一个convert函数,将灯翻译成数字,并且校验结果的有效性。

代码

class Solution:
    """
    通过递归的形式, 对其进行赋值
    """
    def readBinaryWatch(self, turnedOn: int):
        self.watchs = [0] * 10
        self.results = []
        if turnedOn == 0:
            val = self.convert_str2str()
            if val:
                self.results.append(val)
        else:
            self.dfs1(turnedOn, 0)
        return self.results

    def convert_str2str(self):
        hour = ''
        for i in range(4):
            hour += str(self.watchs[i])
        hour = int(hour, 2)
        minute = ''
        for i in range(4, len(self.watchs)):
            minute += str(self.watchs[i])
        minute = int(minute, 2)
        if hour > 11 or minute > 59:
            return False
        result = '%d:%02d' % (hour, minute)
        return result

    def dfs1(self, turnedOn, start_idx):
        for i in range(start_idx, len(self.watchs)):
            turnedOn -= 1
            start_idx += 1
            self.watchs[i] = 1
            if turnedOn == 0:
                val = self.convert_str2str()
                if val:
                    self.results.append(val)
            else:
                self.dfs1(turnedOn, start_idx)
            self.watchs[i] = 0
            turnedOn += 1

s = Solution()
print(s.readBinaryWatch(0))