日常刷题(11)

1. 检查是否存在满足条件的数字组合

1.1. 题目描述

给定一个正整数数组,检查数组中是否存在满足规则的数字组合

规则:A = B + 2C

1.2. 输入描述

第一行输出数组的元素个数。

接下来一行输出所有数组元素,用空格隔开。

1.3. 输出描述

如果存在满足要求的数,在同一行里依次输出规则里A/B/C的取值,用空格隔开。

如果不存在,输出0。

备注
数组长度在3-100之间。
数组成员为0-65535,数组成员可以重复,但每个成员只能在结果算式中使用一次。如:数组成员为[0, 0, 1, 5],0出现2次是允许的,但结果0 = 0 + 2 * 0是不允许的,因为算式中使用了3个0。
用例保证每组数字里最多只有一组符合要求的解。

1.4. 用例

输入
4
2 7 3 0
输出 7 3 2
说明 7 = 3 + 2 * 2

输入 3
1 1 1
输出 0
说明 找不到满足条件的组合

1.5. 题目解析

数组长度在3-100之间,且只有一组答案,写的糙一点也没问题

1.6. 代码

class Solution:
    def __call__(self, nums: List[int]):
        nums.sort()
        for i, b in enumerate(nums):
            for j, c in enumerate(nums[i + 1:], start=i + 1):
                a = b + 2 * c
                if a in nums[j + 1:]:
                    return [a, b, c]
                a = c + 2 * b
                if a in nums[j + 1:]:
                    return [a, b, c]
        return 0

2. 解密犯罪时间

2.1. 题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。

根据警察和线人的约定,为了隐蔽,该时间是修改过的,

解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。

每个出现数字都可以被无限次使用。

2.2. 输入描述

形如HH:SS字符串,表示原始输入。

2.3. 输出描述

形如HH:SS的字符串,表示推理处理的犯罪时间。

备注
1.可以保证现任给定的字符串一定是合法的。

例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。

2.最近的时刻可能在第二天。

2.4. 用例

输入 输出
20:12 20:20
23:59 22:22
12:58 15:11
18:52 18:55
23:52 23:53
09:17 09:19
07:08 08:00

2.5. 题目解析

根据字面的数字,组合出一个离得最近的时间。排列组合最多也就4^4种,全部找出来然后算时间差或者排序了找最近都可以。

2.6. 代码

class Solution:
    def get_time(self, time: str):
        time = list(set(time))
        for a in time:
            for b in time:
                if int(a + b) >= 24:
                    continue

                for c in time:
                    for d in time:
                        if int(c + d) >= 60:
                            continue

                        yield a + b + c + d

    def __call__(self, time: str):
        times = [_time for _time in self.get_time(time)]
        times.sort()
        pos = times.index(time)
        return times[pos + 1]

你可能感兴趣的:(日常刷题,python,算法,leetcode)