其他分享
首页 > 其他分享> > 刷题0704

刷题0704

作者:互联网

1. 401lc

# -*- coding:utf-8 -*-
# Author: Lucy

"""
top:[1,2,4.8]   [0,11]
down:[1,2,4,8,16,32]    [0,59]

给出亮灯的数量,返回所有可能的时间,
时间的要求,时不能为0开头
返回的字符串用:来拼接

划分点应该以top的个数来划分:
top的时间有1个情况,任选1个
top的时间有2个情况,任选2个,单大于11的要排除
。。。
总共亮灯的个数-top的个数=down的个数
down里面寻找指定个数的组合,结果在【0,59】的结果要留下
permutation(iterable,2)

"""
import itertools

top = [1,2,4,8]
down = [1,2,4,8,16,32]

turnedOn = 3
top_n = len(top)
down_n = len(down)
time = ""
hour_ll = sorted([i for i in range(top_n)])
res_list= []
if turnedOn < top_n:
    if hour == hour_ll[0]:
        minute_list = list(itertools.permutations(down, turnedOn))
        # print(minute_list)
        minute_res = []
        for i in minute_list:
            if sum(i)>59:
                continue
            minute_res.append(sum(i))
        minute_res = list(set(minute_res))
        # print(minute_res)
        for i in minute_res:
            time = "00:" + str(i).rjust(2,'0')
            res_list.append(time)
        print(res_list)
    if hour == 1:
        minute_list = list(itertools.permutations(down, turnedOn-1))
        print(minute_list)
        minute_res = []
        # for i in minute_list:
        #     if sum(i)>59:
        #         continue
        #     minute_res.append(sum(i))
        # minute_res = list(set(minute_res))
        # print(minute_res)
        # for i in minute_res:
        #     time = "00:" + str(i).rjust(2,'0')
        #     res_list.append(time)
        # print(res_list)



from itertools import combinations,product


from itertools import combinations, permutations
class Solution:
    def readBinaryWatch(self, num: int) -> List[str]:
        h_m = ['8','4','2','1',32,16,8,4,2,1]
        result = []
        for i in list(combinations(h_m,num)):
            print(i)
            hour=0
            minute=0
            for j in i:
                if isinstance(j,str):
                    hour+=int(j)
                else:
                    minute+=j
            if hour<12 and minute<60:
                hour = str(hour)
                if minute==0:
                    minute='00'
                elif minute<10:
                    minute='0'+str(minute)
                else:
                    minute=str(minute)
                result.append(hour +":"+minute)
        return result

 

2. 88lc

# -*- coding:utf-8 -*-
# Author: Lucy

"""
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。


方法一:重新赋值之后再排序
思路:巧妙运用索引截取给列表后半部分重新赋值
考察点:
1.列表某b部分也是可以重新赋值的,该列表就会变成新的列表,一定要学会使用这种思想,打开这种意识;
2.nums1.sort()和sorted(nums)的区别
nums1.sort()  排序后还是nums1,不可以对它进行赋值操作
sorted(nums1)  是可以外面加一层赋值的操作
"""
from typing import List

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:] = nums2
        print("nums1", nums1)
        nums1.sort()
        return nums1


if __name__ == '__main__':
    nums1 = [1, 2, 3, 0, 0, 0]
    m = 3
    nums2 = [2, 5, 6]
    n = 3
    ss = Solution()
    print(ss.merge(nums1, m, nums2, n))

 

3.   721lc

 

"""
\输入:
accounts = [["John", "johnsmith@mail.com", "john00@mail.com"],
["John", "johnnybravo@mail.com"],
["John", "johnsmith@mail.com", "john_newyork@mail.com"],
["Mary", "mary@mail.com"]]

输出:
[["John", 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com'],  ["John", "johnnybravo@mail.com"], ["Mary", "mary@mail.com"]]

解释:
第一个和第三个 John 是同一个人,因为他们有共同的邮箱地址 "johnsmith@mail.com"。
第二个 John 和 Mary 是不同的人,因为他们的邮箱地址没有被其他帐户使用。
可以以任何顺序返回这些列表,例如答案 [['Mary','mary@mail.com'],['John','johnnybravo@mail.com'],
['John','john00@mail.com','john_newyork@mail.com','johnsmith@mail.com']] 也是正确的。

思路:
每个列表的索引0取出来,
索引相同,如果剩下对应的列表中如果有相同的元素,则将对应的列表合并成新的列表,包括索引0也要合并;
索引相同,如果剩下对应的列表中没有相同的元素,则不需要合并;
如果索引不同,保持原样不变化


并查集的解法:
"""


class Solution(object):
    def accountsMerge(self, accounts):
        # 用parents维护每一行的父亲节点
        # 如果parents[i] == i, 表示当前节点为根节点
        parents = [i for i in range(len(accounts))]
        dic = {}

        # 查找x的根root
        def find(x):
            root = x
            while root != parents[root]:
                root = parents[root]
            return root

        # 把x和y合并
        def union(x, y):
            parents[find(x)] = find(y)

        # 如果发现某一行的某个邮箱在之前行出现过,那么把该行的index和之前行合并(union)即可
        for i in range(len(accounts)):
            for email in accounts[i][1:]:
                if email in dic:
                    union(dic[email], i)
                else:
                    dic[email] = i

        users = collections.defaultdict(set)
        res = []
        # 1. users:表示每个并查集根节点的行有哪些邮箱
        # 2. 使用set:避免重复元素
        # 3. 使用defaultdict(set):不用对每个没有出现过的根节点在字典里面做初始化
        for i in range(len(accounts)):
            for account in accounts[i][1:]:
                users[find(i)].add(account)

        # 输出结果的时候注意结果需按照字母顺序排序(虽然题目好像没有说)
        for key, val in users.items():
            res.append([accounts[key][0]] + sorted(val))

        return res

 

标签:res,list,mail,0704,com,nums1,minute,刷题
来源: https://www.cnblogs.com/wz123/p/16441583.html