leetcode 困难题型

895. 最大频率栈

困难
相关标签
相关企业
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。

实现 FreqStack 类:

FreqStack() 构造一个空的堆栈。
void push(int val) 将一个整数 val 压入栈顶。
int pop() 删除并返回堆栈中出现频率最高的元素。
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。

示例 1:

输入:
[“FreqStack”,“push”,“push”,“push”,“push”,“push”,“push”,“pop”,“pop”,“pop”,“pop”],
[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]
输出:[null,null,null,null,null,null,null,5,7,5,4]
解释:

#超时了!!!
class FreqStack:
    def __init__(self):
        self.l1=[]
        self.dic={}

    def push(self, val: int) -> None:
        self.l1.append(val)

    def pop(self) -> int:
        for i in list(set(self.l1)):
            if self.l1.count(i) not in self.dic:
                self.dic[self.l1.count(i)] = []
                self.dic[self.l1.count(i)].append(i)
            else:
                self.dic[self.l1.count(i)].append(i)
        l2=self.l1[::-1]
        print(self.dic)
        for j in l2:
            if j in self.dic[max(self.dic)]:
                del l2[l2.index(j)]
                self.l1=l2[::-1]
                self.dic={}
                return j

25. K 个一组翻转链表

已解答
困难
相关标签
相关企业
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

#转数组
class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        a,b=0,[]
        l1=head
        while l1:
            a+=1
            b.append(l1.val)
            l1=l1.next
        for i in range(a//k):
            b[i*k:((i+1)*k)]=b[i*k:((i+1)*k)][::-1]
        l2=head
        for i in range(len(b)):
            l2.val=b[i]
            l2=l2.next
        return head

899. 有序队列

已解答
困难
相关标签
相关企业
给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个,并把它加到字符串的末尾。

返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串 。

示例 1:

输入:s = “cba”, k = 1
输出:“acb”
解释:
在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。
在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。
示例 2:

输入:s = “baaca”, k = 3
输出:“aaabc”
解释:
在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。
在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。

提示:

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

class Solution:
    def orderlyQueue(self, s: str, k: int) -> str:
        if k==1:
            b,c,e=s[0],[],[]
            for i in s:
                if b > i:
                    b=i
            for j in range(len(s)):
                if s[j] == b:
                    c.append(s[j:] + s[0:j])
            return min(c)
        else:
            return "".join(sorted(s))

4. 寻找两个正序数组的中位数

已解答
困难
相关标签
相关企业
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        a=nums1+nums2
        if a:
            a.sort()
            if len(a) & 1:
                return a[len(a)//2]
            else:
                return (a[len(a)//2] + a[len(a)//2-1]) /2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值